我有一个从本地数据库CursorLoader
加载数据的。SQLite
中的数据SQLite
实际上是远程API
响应的缓存副本,因此SQLite
每当CursorLoader
.
以下是我响应我的数据查询所遵循的步骤序列ContentProvider
:
SQLite
在返回的游标上cached data. cursor.setNotificationUri(getContext().getContentResolver(), uri)
调用查询。启动对 remote 的异步调用
API
。一旦收到响应,getContext().getContentResolver().notifyChange(uri, null)
就会调用。休眠
5
几秒钟以导致延迟接收光标CursorLoader
。(这样做是为了轻松重现我的问题)。将获得的光标返回
Step 1
到CursorLoader
.
在异步远程API
调用完成(notifyChange()
并被调用)的不太可能但可能的情况下,可以通过调用在获得的游标上CursorLoader
注册 a [参见http://grepcode.com/file/repository.grepcode.com/java/ext /com.google.android/android/4.0.1_r1/android/content/CursorLoader.java#CursorLoader.loadInBackground%28%29 ],数据更改通知被遗漏,因此看不到更新的数据。ContentObserver
registerContentObserver(cursor, mObserver)
CursorLoader
Activity
我可以通过编写LoaderCallBacks
这样的方法来解决这个问题,即数据被加载两次——首先只加载缓存的数据,然后发出refresh
请求。这样,在呼叫开始之前CursorLoader
就可以注册。ContentObserver
refresh
但是,理想情况下,这应该由它CursorLoader
自己处理,因为它会CursorLoader
宣传游标的自动更新。每次都这样做Activity
会导致Activity
代码膨胀。