Activity重建时如何重新获取文件下载进度

做了一个下载文件的列表,用RecyclerView展示。点击下载某个文件,交由单独的下载类去处理(单例),下载类计算下载进度返回给UI进行更新。但是当用户点击返回按钮返回上一级的时候,下载线程没有停止,activity被销毁。重新进入此Activity的时候,RecylerView里的对象是通过网络新获取的,怎么设计才能让此时RecyclerView里的对象和下载类里的对象对应起来呢?否则无法实时更新进度及状态。

阅读 3.8k
3 个回答

这种涉及到对象销毁重建的逻辑处理时要注意解耦,不应该去让对象引用对应起来,而是数据值对应起来。网络处理不要直接放在Activity或RecylerView里进行。对于下载,最好是起后台服务来管理你的下载线程,然后让服务和Activity进行数据通信,这样你就不用关心你的对象是否能对应上了,你只需要关心服务报告给你的下载进度值。至于Service和Activity的交互,网上太多的教程和轮子了,我就不再啰唆了。

不论是系统自带的DownloadManager还是自定义的下载组件, 一个文件下载都会有一个下载ID, 或者对应一个Uri. 值得一提的是, 系统自动的DownloadManager是通过数据库来保持下载信息的.

  1. 有了这个前提, 还是不够的, 需要设法来获取各文件的下载进度. 这个就和DownloadManager的具体实现有关了, 以系统的为例, 貌似只提供Query的接口, 因此, 我们需要创建一个后台线程来实时查询下载进度.

  2. 最后就是需要考虑如何管理ID或者Uri与RecyclerViewItemView之间的对应关系了.

上述 1 & 2, 完全可以参考一些主流的图片异步加载框架(如 github: nostra13/Android-Universal-Image-Loader)来实现.

p.s.如果觉得太复杂可以参考github: erehmi/CountDownTask. (厚脸皮地推荐下自己的项目 [捂脸])

p.p.s.不建议直接notifyDataChanged()来刷新整个列表, 性能太低.

这类下载任务最好还是用service

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏