搜索

首页  >  问答  >  正文

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

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

天蓬老师天蓬老师2771 天前419

全部回复(3)我来回复

  • ringa_lee

    ringa_lee2017-04-18 09:55:27

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

    回复
    0
  • 高洛峰

    高洛峰2017-04-18 09:55:27

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

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

    2. 最后就是需要考虑如何管理ID或者Uri与RecyclerViewItemView

      1. 有了这个前提, 还是不够的, 需要设法来获取各文件的下载进度. 这个就和DownloadManager的具体实现有关了, 以系统的为例, 貌似只提供Query的接口, 因此, 我们需要创建一个后台线程来实时查询下载进度.
    3. 最后就是需要考虑如何管理ID或者Uri与RecyclerViewItemView之间的对应关系了.

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

      #🎜🎜#p.s.如果觉得太复杂可以参考github: erehmi/CountDownTask. (厚脸皮地推荐下自己的项目 [捂脸])#🎜🎜# #🎜🎜#p.p.s.不建议直接notifyDataChanged()来刷新整个列表, 性能太低.#🎜🎜#

      回复
      0
  • ringa_lee

    ringa_lee2017-04-18 09:55:27

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

    回复
    0
  • 取消回复