如何处理禁止网络线程并需要在UI线程上更新列表适配器?

时间:2013-03-14 18:44:00

标签: java android listadapter couchbase

开发使用CouchBase作为其数据存储区的Android应用程序。与Couch的所有交互都是通过HTTP进行的,因此无法在UI线程上完成。这通常是我们可以非常合理地解决的问题,但是我遇到了这个问题时遇到了困难和困难的地方:

我正在尝试开发一个封装/可重用的CouchListAdapter。概念是,从页面中的Couch获取数据然后缓存它。说页面大小为20,因此在初始化时,首先获取20,然后在询问21时,请获取21 - 40

由于线程上禁止网络,我的CouchViewLoader有方法JSONObject getItemAt(int i)int getCount(),当被问及它没有的数据时,必须启动异步线程到获取数据,然后发出由封闭活动处理的广播,然后重新绑定/通知数据已更改。

我几乎让它工作但我现在陷入困境:

  

java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。

如何协调在UI线程上无法访问Couch以及是否只需要从UI线程更新我的适配器?

当然其他人已经解决了这个问题?

(请记住,这一切都是围绕着这样的想法设计的,即给定视图可能会返回比我们可以放入内存或显示在屏幕上更多的结果。)

2 个答案:

答案 0 :(得分:0)

您考虑过AsyncTask吗?

你可以在doInBackground(...)中努力工作。

然后,您可以在onPostExecute(...)方法中更新ListAdapter。

答案 1 :(得分:0)

您可能需要考虑将content providerloaders一起使用。基本上,您需要的所有信息都位于这些链接上。

一般观点:

  • 内容提供商提供数据。
  • 加载程序从后台线程中的内容提供程序获取数据。
  • 加载程序完成后台作业后,会通知用户界面(例如CursorAdapterCursorTreeAdapter ...)进行更新。

你的工作是:

  • 让您的内容提供商向服务器查询数据。您可以在内容提供商中执行网络任务。
  • 使用加载器获取的数据装饰UI。

关于内容提供商,虽然他们说如果您不打算与其他应用程序共享数据,则不需要开发自己的提供程序。 - 但他们强烈建议使用加载程序(他们使用support library支持较旧的API),根据我的经验,内容提供商将节省您的时间。我会说:只需与内容提供商联系: - )