我有一個IntentService,它使用來自網絡源(AWS SDB表)的數據加載ArrayList。 ArrayList位於全局空間中 - 可以通過調用Activity和IntentService訪問(例如:appState = ((App)getApplicationContext())
)。當IntentService完成時,它通過ResultReceiver通知Activity,並且Activity調用adapter.notifyDataChanged()
來更新ListView。如何從IntentService返回ArrayList結果
該解決方案大部分時間都在工作......但這違反了只有UI線程應該更改ListView底層數據的規則。因此,我有時會遇到錯誤:「適配器的內容已更改,但ListView未收到通知。」
我認爲這一定是常見的情況。如果您對此問題有任何建議或最佳做法,請告知我們。這裏有三個選項,我所知道的:
保持
IntentService
,並將其存儲在結果成爲另一個「工作」的ArrayList,也是全球空間。當結果準備就緒後,IntentService會調用ResultReceiver(在UI線程上),然後可以:a)將結果複製到與ListView關聯的ArrayList中,並b)調用adapter.notifyDataChanged()。 CONS:我不喜歡將臨時/工作數據放入全局空間的想法,並且複製結果列表似乎效率低下。保留
IntentService
,並讓結果通過一個加載了ParcelableArrayList的包返回。缺點:我不確定這種方法是否適用於非常大的結果集。它還需要複製結果列表。切換到
Service
構建結果列表的本地副本。讓Activity直接訪問服務的地址空間以讀取結果列表。 CON:仍然需要將結果複製到與ListView關聯的ArrayList。
謝謝。
經過多一點研究,似乎'Parcelable'可能確實是這種情況的一個好選擇(選項2)。我會嘗試一下,稍後再做一個更新。謝謝。 – gcl1