2

ネットワーク ソース (AWS SDB テーブル) からのデータで ArrayList をロードする IntentService があります。ArrayList はグローバル空間にあり、呼び出し元の Activity と IntentService の両方にアクセスできます (このように: appState = ((App)getApplicationContext()))。IntentService が完了すると、ResultReceiver を介して Activity に通知し、Activityadapter.notifyDataChanged()は ListView を更新するために呼び出します。

ほとんどの場合、このソリューションは機能しますが、ListView の基になるデータを変更するのは UI スレッドのみであるという規則に違反しています。そのため、「アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした」というエラーが表示されることがあります。

これは一般的な状況でなければならないと思います。この問題に対する提案やベスト プラクティスがあれば教えてください。私が知っている3つのオプションは次のとおりです。

  1. . IntentService_ 結果の準備ができると、IntentService は (UI スレッドで) ResultReceiver を呼び出します。これにより、a) ListView に関連付けられた ArrayList に結果をコピーし、b) adapter.notifyDataChanged() を呼び出します。短所: 一時/作業データをグローバル空間に置くという考えは好きではなく、結果リストをコピーするのは非効率的です。

  2. を保持IntentServiceし、ParcelableArrayList をロードしたバンドルを介して結果を返すようにします。短所: このアプローチが非常に大きな結果セットに対応できるかどうかはわかりません。また、結果リストをコピーする必要があります。

  3. Service結果リストのローカル コピーを作成する に切り替えます。結果リストを読み取るために、Activity が Service のアドレス空間に直接アクセスするようにします。CON: ListView に関連付けられた ArrayList に結果をコピーする必要があります。

ありがとうございました。

4

1 に答える 1

0

Parcelable使用(つまり、上記のオプション 2)に切り替えましたが、現在は正常に動作しています。この受け入れられた回答のコードを参照として使用しました。

まだテスト中ですが、アダプターの基になるリストを UI スレッドから更新することで発生していたエラーが、この変更によって解決されたと確信しています。100 個を超える要素を持つリストについてはまだ試していませんが、これまでのところうまくいきました。ありがとう。

于 2012-11-28T17:02:19.340 に答える