我做了关于如何使用this tutorial和ojit_a的加载程序的研究
我怎么看:
我们有一个ContentProviders
和Activity
,ListView
和SimpleCursorAdapter
。我们还实现了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的ContentObserver
的Context
注册自己的ContentResolver
(扩展了setNotificationUri
)。
因此,一旦ContentResolver
知道URI的内容已更改(当您在getContext().getContentResolver().notifyChange(uri, contentObserver);
的ContentProvider
,insert()
和update()
方法中调用delete()
时,就会发生这种情况),它会通知所有观察者,包括CursorLoader的ForceLoadContentObserver
。ForceLoadContentObserver
然后将Loader的mContentChanged标记为true