什么是setNotificationUri的机制?(What's the mechanism

2019-07-30 18:54发布

我刚刚实施了CursorLoader和它的伟大工程! 其实,我不相信,当底层数据改变,直到我测试了我的ListView将自动更新。 这显然是setNotificationUri的魔力。

我的问题是,它如何知道什么时候在游标中的数据发生了变化? 说我悄悄地插入一个额外行的地方。 请问底层机制不断地查询数据库,并将其与过去的数据进行比较? 那不可怕效率低下,如果数据集是大?

以前我用过的cursorloaders,我将手动必要时刷新。 这是伟大的,我没有这样做了,但它是有效的,让在后台CursorLoader这样做呢?

Answer 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 ,迫使它加载新的数据。



文章来源: What's the mechanism of setNotificationUri?