【发布时间】:2012-11-28 03:43:24
【问题描述】:
我有一个 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,它会构建结果列表的本地副本。让 Activity 直接访问 Service 的地址空间以读取结果列表。 CON:仍然需要将结果复制到与 ListView 关联的 ArrayList。
谢谢。
【问题讨论】:
-
经过更多研究,
Parcelable似乎确实是这种情况下的一个不错的选择(选项 2)。我会尝试一下,稍后在这里提供更新。谢谢。
标签: android android-intent android-listview android-service intentservice