做了一个下载文件的列表,用RecyclerView展示。点击下载某个文件,交由单独的下载类去处理(单例),下载类计算下载进度返回给UI进行更新。但是当用户点击返回按钮返回上一级的时候,下载线程没有停止,activity被销毁。重新进入此Activity的时候,RecylerView里的对象是通过网络新获取的,怎么设计才能让此时RecyclerView里的对象和下载类里的对象对应起来呢?否则无法实时更新进度及状态。
做了一个下载文件的列表,用RecyclerView展示。点击下载某个文件,交由单独的下载类去处理(单例),下载类计算下载进度返回给UI进行更新。但是当用户点击返回按钮返回上一级的时候,下载线程没有停止,activity被销毁。重新进入此Activity的时候,RecylerView里的对象是通过网络新获取的,怎么设计才能让此时RecyclerView里的对象和下载类里的对象对应起来呢?否则无法实时更新进度及状态。
不论是系统自带的
DownloadManager
还是自定义的下载组件, 一个文件下载都会有一个下载ID, 或者对应一个Uri. 值得一提的是, 系统自动的DownloadManager
是通过数据库来保持下载信息的.
有了这个前提, 还是不够的, 需要设法来获取各文件的下载进度. 这个就和DownloadManager
的具体实现有关了, 以系统的为例, 貌似只提供Query的接口, 因此, 我们需要创建一个后台线程来实时查询下载进度.
最后就是需要考虑如何管理ID或者Uri与RecyclerView
的ItemView
之间的对应关系了.
上述 1 & 2, 完全可以参考一些主流的图片异步加载框架(如 github: nostra13/Android-Universal-Image-Loader)来实现.
p.s.如果觉得太复杂可以参考github: erehmi/CountDownTask. (厚脸皮地推荐下自己的项目 [捂脸])
p.p.s.不建议直接notifyDataChanged()来刷新整个列表, 性能太低.
4 回答4.7k 阅读
2 回答2k 阅读✓ 已解决
1 回答1.5k 阅读✓ 已解决
1 回答854 阅读✓ 已解决
2 回答1.6k 阅读
1 回答1.7k 阅读
1 回答1.5k 阅读
这种涉及到对象销毁重建的逻辑处理时要注意解耦,不应该去让对象引用对应起来,而是数据值对应起来。网络处理不要直接放在Activity或RecylerView里进行。对于下载,最好是起后台服务来管理你的下载线程,然后让服务和Activity进行数据通信,这样你就不用关心你的对象是否能对应上了,你只需要关心服务报告给你的下载进度值。至于Service和Activity的交互,网上太多的教程和轮子了,我就不再啰唆了。