【问题标题】:Android download queue using DownloadManger使用 DownloadManger 的 Android 下载队列
【发布时间】:2014-12-23 21:38:53
【问题描述】:

我正在使用 DownloadManager 在 android 中下载我的文件,它非常棒,因为它可以处理所有事情(连接丢失、重试等)。问题是我希望我的文件一个接一个地下载到队列中,就我而言知道 DownloadManager 不提供此功能。所以多次调用 DownloadManager.enqueue(...) 会导致所有文件的并发下载。我怎样才能解决这个问题?

我不能只是在我的活动中排队,然后将下载一个一个地发送到 DownloadManger,因为活动可能随时被破坏!

IntentService 在这里也不起作用!!即使它一个一个地处理请求,对 DownloadManager.enqueue() 的调用也会运行得如此之快,然后下一次调用,结果将再次并发下载!

我的第三个选择是使用 LocalService 获取请求并在先前开始的下载完成时调用 DownloadManager.enqueue() 但我应该怎么做?我的服务即使在运行时也需要从我的活动中获取请求! (所以我不能只把数据放在意图中)。为了实现通信,我需要将其设置为绑定服务,并且正如文档所说,当没有任何绑定时它会破坏!

bound service runs only as long as another application component is bound to it. 
Multiple components can bind to the service at once, but when all
of them unbind, the service is destroyed.

因此,当我的活动关闭时,我会丢失排队的下载。我对吗?

最后一个选项是在单独的进程中使用服务,因为即使我的第三个选项有效,只要应用程序未关闭,它也只会下​​载文件。这个选项似乎很可怕,因为我必须处理进程间通信,我不知道那是什么!!

所以我错过了什么?!这不应该是解决我的问题的更简单方法吗?

我只是下载文件是队列!我也不希望我的服务在没有什么可下载的情况下无限期地运行。

【问题讨论】:

    标签: android android-service android-download-manager android-service-binding


    【解决方案1】:

    很简单:

    1)创建一个数据库并将您的网址插入其中。

    2) 在您的清单中为 downloadmanager 的下载完成操作创建接收器。

    3)当收到下载完成时,从您的数据库中读取一行并开始新的下载(入队)。

    愉快的编码:-)

    【讨论】:

    • 我已经完成了所有这些!我认为您没有正确理解我的问题。我知道我的下载何时完成,我可以开始新的。问题是,如果我只是按照您所说的去做,应用程序将可以正常工作,直到应用程序关闭甚至应用程序进入后台。在这种情况下,将不再下载队列中的其他下载。
    • 我想你可能是对的!但我不确定我想这样做。因为每当下载某些内容时,我的应用程序都会收到通知,并且 99% 的时间它与我的应用程序无关。无论如何,我找到了使用 IntentService 解决此问题的方法。看我的回答
    • 如何在我的主屏幕上更新这些下载的进度?任何帮助表示赞赏。提前致谢
    【解决方案2】:

    我找到了答案! IntentService 的问题在于它执行 DownloadManager.engueue() 的速度如此之快,结果所有下载都一起下载。因此,我只需通过在后台线程上调用wait() 来确保在下载完成之前请求不会完成运行。并在调用 Broadcast onReceive 并且我的下载完成时调用 notify()

    我在下载文件后运行它

        currentDownloadId = downloadManager.enqueue(downloadRequest);
        backgroundThread = Thread.currentThread();
        synchronized (Thread.currentThread()) {
            try {
                Thread.currentThread().wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    

    下载完成后我运行这个

    @Override
    public void onReceive(Context context, Intent intent) {
        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0);
        if (downloadId == currentDownloadId) {
            synchronized (backgroundThread) {
                backgroundThread.notify();
            }
        }
    }
    

    现在当前下载的执行完成,下一个自动开始!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多