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

时间:2013-09-14 00:07:01

标签: android listview android-listview android-fragments android-asynctask

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

File1 ...已下载

文件2 ....下载

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

File4 ...待定

...

Listview定期刷新(比如每2秒),文件很大:50 MB左右。所以他们需要1分钟才能下载。

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

考虑用户可能会离开ListView页面离开AsyncTask只能返回以查看下载状态。

那么ListView如何“观察”AsyncTask的进度并显示它?

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

Repeat a task with a time delay?

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

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

Picture

2 个答案:

答案 0 :(得分:5)

请按照以下步骤操作

  1. 使用asyncTask创建服务以下载文件
  2. 在onStartCommand of service
  3. 中启动任务
  4. 在您的活动中注册广播接收者以接收服务进度
  5. onProgressUpdate of AsyncTask向您的活动发送广播
  6. 在ListView中显示进度

答案 1 :(得分:1)

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

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

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

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