setNotificationUri的机制是什么?

我刚刚实现了一个CursorLoader,它工作的很棒! 事实上,我不相信我的ListView会自动更新底层数据更改,直到我testing它。 这显然是setNotificationUri的魔力。

我的问题是,它怎么知道光标中的数据何时改变? 说我悄悄地插入一个额外的行。 底层机制是否经常查询数据库并将其与过去的数据进行比较? 如果数据集很大,这不会是非常低效吗?

在使用cursorloaders之前,我会在必要时手动刷新。 我不必再这么做了,但是让CursorLoader在后台有效吗?

Solutions Collecting From Web of "setNotificationUri的机制是什么?"

请纠正我,如果我在某个地方错了。

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