我刚刚实现了一个CursorLoader,效果很好!实际上,我不相信在基础数据发生更改之前,我的ListView会自动更新,直到我对其进行测试。这显然是setNotificationUri的魔力。

我的问题是,如何知道游标中的数据何时更改?假设我在某处安静地插入了另一行。底层机制是否不断查询数据库并将其与过去的数据进行比较?如果数据集很大,那岂不是效率低下吗?

在使用游标加载器之前,如有必要,我将手动刷新。不必再这样做了,这很好,但是让CursorLoader在后台执行此操作是否有效?

最佳答案

请改正我,如果我在某个地方错了。
ContentProviderquery(…)方法中调用如下内容:

// 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注册的Observer强制其加载新数据。

关于android - setNotificationUri的机制是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11802823/

10-11 00:13