我有一个 IntentService,它使用来自网络源(AWS SDB 表)的数据加载一个 ArrayList。ArrayList 位于全局空间中——调用 Activity 和 IntentService 都可以访问(如下所示:)appState = ((App)getApplicationContext())
。IntentService完成后,通过ResultReceiver通知Activity,Activity调用adapter.notifyDataChanged()
更新ListView。
这个解决方案大部分时间都有效,......但它违反了只有 UI 线程才能更改 ListView 底层数据的规则。因此,有时我会收到错误消息:“适配器的内容已更改,但 ListView 未收到通知。”
我想这一定是一个普遍的情况。如果您对此问题有任何建议或最佳实践,请告诉我。以下是我知道的三个选项:
保留
IntentService
,并让它将结果存储在另一个“工作”的 ArrayList 中,也在全局空间中。当结果准备好时,IntentService 调用 ResultReceiver(在 UI 线程上),然后它可以:a)将结果复制到与 ListView 关联的 ArrayList,以及 b)调用 adapter.notifyDataChanged()。缺点:我不喜欢将临时/工作数据放在全局空间中的想法,并且复制结果列表似乎效率低下。保留
IntentService
,并让它通过加载有 ParcelableArrayList 的包传回结果。缺点:我不确定这种方法是否适用于非常大的结果集。它还需要复制结果列表。切换到
Service
构建结果列表的本地副本的 a。让 Activity 直接访问 Service 的地址空间以读取结果列表。CON:仍然需要将结果复制到与 ListView 关联的 ArrayList。
谢谢你。