我刚刚实现了一个CursorLoader,效果很好!实际上,我不相信在基础数据发生更改之前,我的ListView会自动更新,直到我对其进行测试。这显然是setNotificationUri的魔力。
我的问题是,如何知道游标中的数据何时更改?假设我在某处安静地插入了另一行。底层机制是否不断查询数据库并将其与过去的数据进行比较?如果数据集很大,那岂不是效率低下吗?
在使用游标加载器之前,如有必要,我将手动刷新。不必再这样做了,这很好,但是让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
注册的Observer强制其加载新数据。关于android - setNotificationUri的机制是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11802823/