What's the mechanism of setNotificationUri?
Please, correct me if I'm wrong somewhere.
ContentProvider
calls something like this in query(…)
method:
// Tell the cursor what uri to watch, so it knows when its source data changescursor.setNotificationUri(getContext().getContentResolver(), uri);
CursorLoader
get cursor back and registers an observer.
/* Runs on a worker thread */@Overridepublic Cursor loadInBackground() { Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, mSelectionArgs, mSortOrder); if (cursor != null) { // Ensure the cursor window is filled cursor.getCount(); registerContentObserver(cursor, mObserver); } return cursor;}/** * Registers an observer to get notifications from the content provider * when the cursor needs to be refreshed. */void registerContentObserver(Cursor cursor, ContentObserver observer) { cursor.registerContentObserver(mObserver);}
When someone modifies data, ContentProvider
notifies ContentResolver
about changes:
getContext().getContentResolver().notifyChange(uri, null);
ContentResolver
in its turn notifies all registered observers.
Observer, registered by CursorLoader
, forces it to load new data.