0

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

我正在尝试开发一个封装/可重复使用的CouchListAdapter. 这个概念是,从页面中的 Couch 获取数据,然后缓存它。说页面大小是20,所以在初始化时,首先获取20,然后如果要求21,去获取21- 40

由于线程上网络的禁止,my CouchViewLoaderwhich has methods JSONObject getItemAt(int i)and int getCount(),当被要求提供它没有的数据时,必须启动一个异步线程来获取数据,然后发送一个由封闭活动处理的广播,然后重新绑定/通知数据已更改。

我几乎让它工作了,但现在被困在我得到的地方:

java.lang.IllegalStateException:适配器的内容发生了变化,但ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。

如何调和无法在 UI 线程上点击 Couch 和只需要从 UI 线程更新我的适配器?

其他人肯定已经解决了这个问题吗?

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

4

2 回答 2

0

您可能需要考虑使用带有loader的内容提供程序。基本上,您需要的所有信息都位于这些链接中。

对于一般视图:

  • 内容提供者提供数据。
  • 加载器在后台线程中从内容提供者那里获取数据。
  • 加载器完成后台作业后,它们会通知 UI(例如CursorAdapterCursorTreeAdapter...)进行更新。

你的工作是:

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

关于内容提供者,尽管他们说如果您不打算与其他应用程序共享数据,则无需开发自己的提供者。— 但正如他们强烈推荐使用加载器(他们确实支持带有支持库的旧 API ),并且根据我的经验,内容提供者将节省您很多时间。我会说:就和内容提供商一起去吧:-)

于 2013-03-14T20:59:10.993 回答
0

您是否考虑过AsyncTask

您可以在 doInBackground(...) 中完成艰苦的工作。

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

于 2013-03-14T18:59:26.260 回答