ネットワーク ソース (AWS SDB テーブル) からのデータで ArrayList をロードする IntentService があります。ArrayList はグローバル空間にあり、呼び出し元の Activity と IntentService の両方にアクセスできます (このように: appState = ((App)getApplicationContext())
)。IntentService が完了すると、ResultReceiver を介して Activity に通知し、Activityadapter.notifyDataChanged()
は ListView を更新するために呼び出します。
ほとんどの場合、このソリューションは機能しますが、ListView の基になるデータを変更するのは UI スレッドのみであるという規則に違反しています。そのため、「アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした」というエラーが表示されることがあります。
これは一般的な状況でなければならないと思います。この問題に対する提案やベスト プラクティスがあれば教えてください。私が知っている3つのオプションは次のとおりです。
.
IntentService
_ 結果の準備ができると、IntentService は (UI スレッドで) ResultReceiver を呼び出します。これにより、a) ListView に関連付けられた ArrayList に結果をコピーし、b) adapter.notifyDataChanged() を呼び出します。短所: 一時/作業データをグローバル空間に置くという考えは好きではなく、結果リストをコピーするのは非効率的です。を保持
IntentService
し、ParcelableArrayList をロードしたバンドルを介して結果を返すようにします。短所: このアプローチが非常に大きな結果セットに対応できるかどうかはわかりません。また、結果リストをコピーする必要があります。Service
結果リストのローカル コピーを作成する に切り替えます。結果リストを読み取るために、Activity が Service のアドレス空間に直接アクセスするようにします。CON: ListView に関連付けられた ArrayList に結果をコピーする必要があります。
ありがとうございました。