Android Cursor / ContentProvider在查询和notifyChanged之间是否存在内在竞争条件?

时间:2014-08-13 16:31:16

标签: android multithreading cursor android-contentprovider

我的UI视图需要显示一些内容并保持更新。我计划使用标准的Cursor / ContentProvider框架。不过,我不知道,如果这里可能存在竞争条件:

  • 内容提供商在方法 ContentProvider#query 的实现中使用数据A创建新的 Cursor

  • 当方法查询完成时,同一提供商的另一个线程将数据状态更新为值B.它正确通知世界,调用 ContentResolver的#notifyChanged 。由于内容提供者本质上是多线程的,这似乎很可能。

  • 然后客户端应用程序接收(或可能会收到)更改通知,但它不会收听它,因为它还没有收到 Cursor ,所以没有注册 ContentObserver

  • 带有过时数据的 Cursor 最终传递给binder,然后到达客户端应用程序。客户端应用程序不知道数据已过时。

如果这个问题是虚构的或者实际上有可能丢失数据,请指点一下吗?

1 个答案:

答案 0 :(得分:0)

这不是一个想象中的问题。我有自定义CursorWrapper形式的实验性和有前途的解决方案,您可以从ContentProvider.query()返回。该代码可用here

除了解决您的问题之外,它还允许您在单个Cursor上设置多个通知Uris - 如果返回此Cursor的查询连接多个表,则非常有用。