Подтвердить что ты не робот

Какой механизм setNotificationUri?

Я только что реализовал CursorLoader, и он отлично работает! Фактически, я не думал, что мой ListView будет автоматически обновляться, когда базовые данные будут изменены до тех пор, пока я не проверю его. Это, по-видимому, магия setNotificationUri.

Мой вопрос: как он узнает, когда данные в курсоре изменились? Скажем, я тихо помещу дополнительную строку где-нибудь. Является ли базовый механизм постоянно запрашивать базу данных и сравнивать ее с прошлыми данными? Не будет ли это ужасно неэффективно, если массивы данных большие?

Прежде чем использовать обработчики курсора, я вручную обновляю, когда это необходимо. Замечательно, что мне больше не нужно это делать, но эффективно ли использовать CursorLoader в фоновом режиме?

4b9b3361

Ответ 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, заставляет его загружать новые данные.