我刚刚实施了CursorLoader和它的伟大工程! 其实,我不相信,当底层数据改变,直到我测试了我的ListView将自动更新。 这显然是setNotificationUri的魔力。
我的问题是,它如何知道什么时候在游标中的数据发生了变化? 说我悄悄地插入一个额外行的地方。 请问底层机制不断地查询数据库,并将其与过去的数据进行比较? 那不可怕效率低下,如果数据集是大?
以前我用过的cursorloaders,我将手动必要时刷新。 这是伟大的,我没有这样做了,但它是有效的,让在后台CursorLoader这样做呢?
请纠正我,如果我错了地方。
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
,迫使它加载新的数据。