我做了关于如何使用this tutorial和ojit_a的加载程序的研究

我怎么看:
我们有一个ContentProvidersActivityListViewSimpleCursorAdapter。我们还实现了CursorLoader

ContentProvider中,我们可以通过单击按钮来调用Activity

getContentResolver().insert(URI, contentValues);的实现中,在ContentProvider方法的末尾,我们调用insert(),并且我们的getContentResolver().notifyChange(URI, null);将收到消息,该消息应重新加载数据并更新UI。同样,如果我们在CursorLoader中使用FLAG_REGISTER_CONTENT_OBSERVER,它也会收到消息,并且其方法SimpleCursorAdapter将被调用。

因此,如果我们插入,更新或删除数据,我们的ListView将被更新。

不推荐使用onContentChanged(),不推荐使用Activity.startManagingCursor(cursor);,所以我看不到cursor.requery()有任何实践意义。

我查看了cursor.setNotificationUri()方法的源代码,发现它在方法内部调用了setNotificationUri()mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)也一样。最后,cursor将收到消息,并且在Cursor内部将调用以下方法:

protected void onChange(boolean selfChange) {
    synchronized (mSelfObserverLock) {
        mContentObservable.dispatchChange(selfChange, null);
        // ...
    }
}

但是我无法理解这一点。

所以我的问题是:为什么我们应该在CursorLoader实现的cursor.setNotificationUri()方法中调用query()

最佳答案

如果您调用Cursor.setNotificationUri(),则Cursor将知道它是为哪个ContentProvider Uri创建的。
CursorLoader使用您在调用ForceLoadContentObserver时指定的URI的ContentObserverContext注册自己的ContentResolver(扩展了setNotificationUri)。

因此,一旦ContentResolver知道URI的内容已更改(当您在getContext().getContentResolver().notifyChange(uri, contentObserver);ContentProviderinsert()update()方法中调用delete()时,就会发生这种情况),它会通知所有观察者,包括CursorLoader的ForceLoadContentObserver
ForceLoadContentObserver然后将Loader的mContentChanged标记为true

07-28 00:01