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