如何从IntentService返回ArrayList结果

时间:2012-11-28 03:43:24

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

我有一个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直接访问服务的地址空间以读取结果列表。 CON:仍然需要将结果复制到与ListView关联的ArrayList。

  4. 谢谢。

1 个答案:

答案 0 :(得分:0)

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

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