我有一个从本地数据库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 ],数据更改通知被遗漏,因此看不到更新的数据。ContentObserverregisterContentObserver(cursor, mObserver)CursorLoaderActivity
我可以通过编写LoaderCallBacks这样的方法来解决这个问题,即数据被加载两次——首先只加载缓存的数据,然后发出refresh请求。这样,在呼叫开始之前CursorLoader就可以注册。ContentObserverrefresh
但是,理想情况下,这应该由它CursorLoader自己处理,因为它会CursorLoader宣传游标的自动更新。每次都这样做Activity会导致Activity代码膨胀。