Android下载队列使用下载管理器

时间:2014-12-21 14:14:55

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

我使用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.

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

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

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

我只是下载文件是队列!当没有可供下载的东西时,我也不希望我的服务无限期地运行。

2 个答案:

答案 0 :(得分:5)

很简单:

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

2)创建一个接收器,用于清单中downloadmanager的下载完成操作。

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

快乐的编码: - )

答案 1 :(得分:3)

我找到了答案! 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();
        }
    }
}

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