安卓下载多个文件并在列表视图中显示进度

13
我需要下载N个文件。我想在后台串行下载它们 -- 一个接一个的。我想在ListView中显示进度和状态。因此,ListView看起来像这样:

文件1...已下载

文件2...已下载

文件3...正在下载,进度为39%

文件4...待下载

...

ListView每隔一段时间刷新(比如2秒),这些文件很大:50MB左右。所以它们需要花费1分钟以上的时间来下载。

我将传递一个文件URL列表给AsyncTask,并在后台进行下载。问题是如何将进度反馈到ListView中。

考虑到用户可能会离开ListView页面,只留下运行的AsyncTask,等用户回来再查看下载状态。

那么,ListView如何"观察"AsyncTask的进度并显示它呢?

我想添加一组静态变量AsyncTask(用"Synchronized"块保护它们),然后在Fragment内使用定期的UI更新器来显示ListView。所以Fragment将有类似于以下内容:

重复带时间延迟的任务?

是否有设计模式、公共项目或示例代码可以实现这一点?

对不起,我没有一张好的图片。最接近我所描述的是这里(类似但我计划使用AsyncTask和串行下载):

图片


异步任务是一个过程,可以从developer.android.com了解更多。 - Trikaldarshiii
2
你找到关于它的任何教程了吗? - Mehul Joisar
嘿,你有任何解决方案吗?请在这里分享。 - Pandiri Deepak
2个回答

5

请按照以下步骤操作:

  1. 创建一个包含异步任务的服务来下载文件。
  2. 在服务的onStartCommand中启动任务。
  3. 在您的活动中注册广播接收器以接收服务发送的进度。
  4. 在AsyncTask的onProgressUpdate中向您的活动发送广播。
  5. 在ListView中显示进度。

2
你能提供一些代码来实现这些步骤吗? - CrazyLearner

1

当开始下载时,您可以使用进度条的引用,并使用处理程序更新它。

Asynctask 对您来说不是一个好主意。在深入研究 Asynctask 之前,您应该阅读 this

对于长时间的后台操作,您应该查看 Service。[IntentService] 是这个的良好候选者,因为它使用队列来跟踪多个请求。Boundservice 这种情况是一个很好的选择。

或者,如果您想更好地控制线程池和执行,可以考虑使用阻塞队列和 Executor 编写自己的下载器,在那里您将能够控制线程数和队列大小。


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