Android 下载多个文件并在 ListView 中显示进度

Posted

技术标签:

【中文标题】Android 下载多个文件并在 ListView 中显示进度【英文标题】:Android Download Multiple Files and show progress in ListView 【发布时间】:2013-09-18 18:28:49 【问题描述】:

我有 N 个文件要下载。我想在后台连续下载它们 - 一个接一个。我想在 ListView 中显示进度和状态。所以,ListView 看起来像:

文件1 ...已下载

文件2....已下载

File3... 正在进行中说 39%

文件4...待处理

....

Listview 会定期刷新(比如每 2 秒)并且文件很大:50 MB 左右。所以他们需要 1 分钟以上的时间来下载。

我会将文件 URL 列表传递给 AsyncTask 并在后台下载它。问题是如何将进度反馈给 ListView。

考虑到用户可能离开 ListView 页面而离开 AsyncTask 运行只是为了查看下载状态。

那么 ListView 是如何“观察” AsyncTask 的进度并显示出来的呢?

我正在考虑添加一组静态变量 AsyncTask(使用“同步”块保护它们)并在显示 ListView 的 Fragment 中使用定期 UI 更新程序。所以片段会有这样的东西:

Repeat a task with a time delay?

是否有设计模式、公共项目或示例代码?

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

【问题讨论】:

异步任务是从 developer.android.com 了解更多的过程 你有没有找到任何关于它的教程? 嘿,你有什么解决办法吗?请在这里分享。 【参考方案1】:

按照这些步骤进行

    创建一个包含 asyncTask 的服务用于下载文件 在服务的onStartCommand中启动任务 在您的活动中注册广播接收器以接收服务进度 AsyncTask 的 onProgressUpdate 向您的活动发送广播 在 ListView 中显示进度

【讨论】:

能否提供一些代码来实现这些步骤?【参考方案2】:

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

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

对于持久的后台操作,您应该查看Service。 [IntentService] 是一个很好的候选,因为它使用队列来跟踪多个请求。 Boundservice 这个案例不错的选择。

或者,如果您想要对线程池和执行进行更多控制,您可以考虑使用阻塞队列和执行器编写自己的下载器,您可以在其中控制线程数和队列大小

【讨论】:

以上是关于Android 下载多个文件并在 ListView 中显示进度的主要内容,如果未能解决你的问题,请参考以下文章

android listview每个Item放置多个图片

从服务器下载时,listview 将图像存储在 android 中的位置

Android 多线程断点续传同时下载多个大文件

android怎么获取刚刚下载安装的APK的APP名字和图片

Android - 从自定义列表视图中删除一个项目并在长按时更新它

如何检查视图是不是可见(android listview)