Ответ 1
Пожалуйста, исправьте меня, если я где-то не прав.
ContentProvider
вызывает что-то вроде этого в методе query(…)
:
// Tell the cursor what uri to watch, so it knows when its source data changes
cursor.setNotificationUri(getContext().getContentResolver(), uri);
CursorLoader
верните курсор и зарегистрируйте наблюдателя.
/* Runs on a worker thread */
@Override
public 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);
}
Когда кто-то изменяет данные, ContentProvider
уведомляет ContentResolver
об изменениях:
getContext().getContentResolver().notifyChange(uri, null);
ContentResolver
, в свою очередь, уведомляет всех зарегистрированных наблюдателей.
Наблюдатель, зарегистрированный CursorLoader
, заставляет его загружать новые данные.