做了一个下载文件的列表,用RecyclerView展示。点击下载某个文件,交由单独的下载类去处理(单例),下载类计算下载进度返回给UI进行更新。但是当用户点击返回按钮返回上一级的时候,下载线程没有停止,activity被销毁。重新进入此Activity的时候,RecylerView里的对象是通过网络新获取的,怎么设计才能让此时RecyclerView里的对象和下载类里的对象对应起来呢?否则无法实时更新进度及状态。
欢迎选择我的课程,让我们一起见证您的进步~~
這種涉及到物件銷毀重建的邏輯處理時要注意解耦,不應該去讓物件參考對應起來,而是資料值對應起來。網路處理不要直接放在Activity或RecylerView裡進行。對於下載,最好是起後台服務來管理你的下載線程,然後讓服務和Activity進行數據通信,這樣你就不用關心你的對像是否能對應上了,你只需要關心服務報告給你的下載進度值。至於Service和Activity的交互,網路上太多的教學和輪子了,我就不再囉唆了。
不論是系統自帶的DownloadManager还是自定义的下载组件, 一个文件下载都会有一个下载ID, 或者对应一个Uri. 值得一提的是, 系统自动的DownloadManager是透過資料庫來維持下載資訊的.
DownloadManager
有了這個前提, 還是不夠的, 需要設法來獲取各文件的下載進度. 這個就和DownloadManager的具體實現有關了, 以系統的為例, 貌似只提供Query的接口, 因此, 我們需要創建一個後台執行緒來即時查詢下載進度.
最後就是需要考慮如何管理ID或Uri與RecyclerView的ItemView之間的對應關係了.
RecyclerView
ItemView
上述 1 & 2, 完全可以參考一些主流的圖片異步加載框架(如 github: nostra13/Android-Universal-Image-Loader)來實現.
p.s.如果覺得太複雜可以參考github: erehmi/CountDownTask. (厚臉皮地推薦下自己的項目 [摀臉])
p.p.s.不建議直接notifyDataChanged()來刷新整個清單, 效能太低.
這類下載任務最好還是用service
這種涉及到物件銷毀重建的邏輯處理時要注意解耦,不應該去讓物件參考對應起來,而是資料值對應起來。網路處理不要直接放在Activity或RecylerView裡進行。對於下載,最好是起後台服務來管理你的下載線程,然後讓服務和Activity進行數據通信,這樣你就不用關心你的對像是否能對應上了,你只需要關心服務報告給你的下載進度值。至於Service和Activity的交互,網路上太多的教學和輪子了,我就不再囉唆了。
有了這個前提, 還是不夠的, 需要設法來獲取各文件的下載進度. 這個就和
DownloadManager
的具體實現有關了, 以系統的為例, 貌似只提供Query的接口, 因此, 我們需要創建一個後台執行緒來即時查詢下載進度.最後就是需要考慮如何管理ID或Uri與
RecyclerView
的ItemView
之間的對應關係了.上述 1 & 2, 完全可以參考一些主流的圖片異步加載框架(如 github: nostra13/Android-Universal-Image-Loader)來實現.
p.s.如果覺得太複雜可以參考github: erehmi/CountDownTask. (厚臉皮地推薦下自己的項目 [摀臉])
p.p.s.不建議直接notifyDataChanged()來刷新整個清單, 效能太低.
這類下載任務最好還是用service