【问题标题】:How to return ArrayList results from an IntentService如何从 IntentService 返回 ArrayList 结果
【发布时间】: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 未收到通知。”

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

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

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

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

谢谢。

【问题讨论】:

  • 经过更多研究,Parcelable 似乎确实是这种情况下的一个不错的选择(选项 2)。我会尝试一下,稍后在这里提供更新。谢谢。

标签: android android-intent android-listview android-service intentservice


【解决方案1】:

我切换到使用 Parcelable(即上面的选项 2),现在它工作正常。我使用来自this accepted answer 的代码作为参考。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多