安卓中的下载队列

8

如何在Android中实现下载队列是最佳方式?

我猜测可能有一些平台类可以完成大部分工作。

4个回答

17

在Android中实现下载队列最佳方式是什么?

使用IntentService。它为您提供了队列和后台线程,所以您只需将下载逻辑放在onHandleIntent()中即可。点击此处获取一个演示样例项目


1
你好,Commonsware。上面提到的例子并不是一个下载队列,它只是在后台下载图像。如果我有20张图片要下载怎么办? - Krishna Shrestha
1
@chrish:“上面提到的例子不是一个下载队列” - 是的,它就是。我碰巧只调用了一次。 “如果我有20个图像要下载怎么办?” - 调用startService() 20次,每次都提供IntentService所需的信息,以便知道要下载什么。当一个命令正在处理时,其他命令将在IntentService内排队等待自己的机会。如果您想具有具有多个线程工作的下载队列,请创建自己的Service,该服务使用ThreadPoolExecutor,并在队列为空时调用stopSelf() - CommonsWare
1
@Zookey:让服务使用事件总线来发布下载请求的结果(成功/失败)。让知道有20个文件等待下载的人在该事件总线上订阅并计数。 - CommonsWare
在这里提到使用存储在数据库中的队列与下载管理器和广播接收器有什么问题?https://dev59.com/X4bca4cB1Zd3GeqPTkVF#27590425 - Nabeel K
@CommonsWare 谢谢您的及时回复。在这个方法中,我该如何在我的主屏幕上显示每个下载的进度? - Nabeel K
显示剩余4条评论

2

下载管理器是否按照队列顺序下载文件? - Abdul Rahman

2
我建议您查看java.util.concurrent包,特别是阅读有关 Executors的内容。
您可以创建一个ExecutorService,它每次只运行'n'个Runnable对象,并自动排队其余的任务。一旦正在执行的线程完成执行,它就会选取队列中下一个可执行的Runnable对象进行执行。

1

从API 11开始,一个好的方法是使用带有异步任务的FixedThreadPool。只需执行一次:

ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(3);

其中3是您想同时运行的下载数量。如果已经有3个下载正在运行,它将排队任务,并自动处理任务。 使用以下命令启动异步任务:

yourAsynTask.executeOnExecutor(threadPoolExecutor, params);

Params 可能是您希望连接的 URL。您可以在 asynctask 的 onPostExecute 中读取它,并使用 HttpURLConnection 连接到服务器。

确保在关闭时调用此函数:

threadPoolExecutor.shutdown()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接