我的UI视图需要显示一些内容并保持更新。我计划使用标准的Cursor / ContentProvider框架。不过,我不知道,如果这里可能存在竞争条件:
内容提供商在方法 ContentProvider#query 的实现中使用数据A创建新的 Cursor 。
当方法查询完成时,同一提供商的另一个线程将数据状态更新为值B.它正确通知世界,调用 ContentResolver的#notifyChanged 。由于内容提供者本质上是多线程的,这似乎很可能。
然后客户端应用程序接收(或可能会收到)更改通知,但它不会收听它,因为它还没有收到 Cursor ,所以没有注册 ContentObserver 。
带有过时数据的 Cursor 最终传递给binder,然后到达客户端应用程序。客户端应用程序不知道数据已过时。
如果这个问题是虚构的或者实际上有可能丢失数据,请指点一下吗?
答案 0 :(得分:0)
这不是一个想象中的问题。我有自定义CursorWrapper
形式的实验性和有前途的解决方案,您可以从ContentProvider.query()
返回。该代码可用here。
除了解决您的问题之外,它还允许您在单个Cursor上设置多个通知Uris - 如果返回此Cursor的查询连接多个表,则非常有用。