ローカルデータベースCursorLoader
からデータをロードする があります。SQLite
のデータは、実際にはリモート応答SQLite
のキャッシュされたコピーであるため、.API
SQLite
CursorLoader
以下は、私のデータクエリに応答するために従う一連の手順ですContentProvider
。
Query
SQLite
forcached 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
は、データが 2 回読み込まれるように記述します。最初にキャッシュされたデータのみが読み込まれ、次にrefresh
要求が行われます。このようにして、 はコールが開始される前CursorLoader
に登録されます。ContentObserver
refresh
ただし、カーソルの自動更新をアドバタイズするため、これは理想的にはCursorLoader
それ自体で処理する必要があります。CursorLoader
すべてでそれを行うとActivity
、コードが大量に肥大化しActivity
ます。