2

我有一个 IntentService,它使用来自网络源(AWS SDB 表)的数据加载一个 ArrayList。ArrayList 位于全局空间中——调用 Activity 和 IntentService 都可以访问(如下所示:)appState = ((App)getApplicationContext())。IntentService完成后,通过ResultReceiver通知Activity,Activity调用adapter.notifyDataChanged()更新ListView。

这个解决方案大部分时间都有效,......但它违反了只有 UI 线程才能更改 ListView 底层数据的规则。因此,有时我会收到错误消息:“适配器的内容已更改,但 ListView 未收到通知。”

我想这一定是一个普遍的情况。如果您对此问题有任何建议或最佳实践,请告诉我。以下是我知道的三个选项:

  1. 保留IntentService,并让它将结果存储在另一个“工作”的 ArrayList 中,也在全局空间中。当结果准备好时,IntentService 调用 ResultReceiver(在 UI 线程上),然后它可以:a)将结果复制到与 ListView 关联的 ArrayList,以及 b)调用 adapter.notifyDataChanged()。缺点:我不喜欢将临时/工作数据放在全局空间中的想法,并且复制结果列表似乎效率低下。

  2. 保留IntentService,并让它通过加载有 ParcelableArrayList 的包传回结果。缺点:我不确定这种方法是否适用于非常大的结果集。它还需要复制结果列表。

  3. 切换到Service构建结果列表的本地副本的 a。让 Activity 直接访问 Service 的地址空间以读取结果列表。CON:仍然需要将结果复制到与 ListView 关联的 ArrayList。

谢谢你。

4

1 回答 1

0

我切换到使用Parcelable(即上面的选项2),现在它工作正常。我使用这个接受的答案中的代码作为参考。

仍在测试中,但我很确定更改通过从 UI 线程更新适配器的基础列表解决了我遇到的错误。我还没有尝试过超过 100 个元素的列表,但到目前为止还不错。谢谢。

于 2012-11-28T17:02:19.340 回答