做了一个下载文件的列表,用RecyclerView展示。点击下载某个文件,交由单独的下载类去处理(单例),下载类计算下载进度返回给UI进行更新。但是当用户点击返回按钮返回上一级的时候,下载线程没有停止,activity被销毁。重新进入此Activity的时候,RecylerView里的对象是通过网络新获取的,怎么设计才能让此时RecyclerView里的对象和下载类里的对象对应起来呢?否则无法实时更新进度及状态。
ringa_lee2017-04-18 09:55:27
この種のロジック処理にオブジェクトの破棄と再構築が含まれる場合は、オブジェクト参照をマッピングするのではなく、データ値をマッピングする必要があります。ネットワーク処理を Activity または RecyclerView に直接配置しないでください。ダウンロードの場合は、ダウンロード スレッドを管理するバックグラウンド サービスを開始し、そのサービスがアクティビティと通信できるようにするのが最善です。この方法では、オブジェクトが対応できるかどうかを気にする必要はありません。サービスによって報告されるダウンロードの進行状況の値。 Service と Activity の間の相互作用については、インターネット上にあまりにも多くのチュートリアルとホイールがあるため、詳細については説明しません。
高洛峰2017-04-18 09:55:27
システム独自の
DownloadManager
であっても、カスタム ダウンロード コンポーネントであっても、ファイルのダウンロードにはダウンロード ID が含まれるか、Uri に対応することになります。システムには自動的にDownloadManager
が渡されることに注意してください。ダウンロード情報を保持します。
この前提では、各ファイルのダウンロードの進行状況を取得する方法を見つける必要があります。これは、DownloadManager
の特定の実装に関連しています。 Query インターフェイスのみを提供しているようです。そのため、ダウンロードの進行状況をリアルタイムでクエリするためのバックグラウンド スレッドを作成する必要があります。
最後に、ID または Uri と RecyclerView
の ItemView
との対応をどのように管理するかを考える必要があります。
上記の 1 と 2 は、いくつかの主流の画像非同期読み込みフレームワーク (github: nostra13/Android-Universal-Image-Loader など) を参照して実装できます。
追伸、複雑すぎると思われる場合は、github: erehmi/CountDownTask を参照してください (恥知らずにも自分のプロジェクト [顔カバー] をお勧めします)
p.p.s. リスト全体を更新するために直接 notificationDataChanged() を実行することはお勧めできません。パフォーマンスが低すぎるためです。