【发布时间】:2014-03-04 15:02:29
【问题描述】:
我研究了如何使用ContentProviders 和来自this tutorial 的加载器
我是怎么看的:
我们有一个Activity 和ListView、SimpleCursorAdapter 和CursorLoader。我们还实现了ContentProvider。
在Activity 中,我们可以通过单击按钮调用getContentResolver().insert(URI, contentValues);。
在我们的ContentProvider 实现中,在insert() 方法的末尾,我们调用getContentResolver().notifyChange(URI, null); 并且我们的CursorLoader 将接收到它应该重新加载数据并更新UI 的消息。此外,如果我们在SimpleCursorAdapter 中使用FLAG_REGISTER_CONTENT_OBSERVER,它也会收到消息,并调用其方法onContentChanged()。
所以如果我们插入、更新或删除数据,我们的 ListView 将会更新。
Activity.startManagingCursor(cursor); 已弃用,cursor.requery() 已弃用,所以我看不出 cursor.setNotificationUri() 有任何实践意义。
我查看了setNotificationUri() 方法的源代码,发现它在方法内部调用了mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)。 CursorLoader 也一样。最后 cursor 将收到消息,并在 Cursor 内部调用以下方法:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
但我无法理解这一点。
所以我的问题是:我们为什么要在 query() 方法的 ContentProvider 实现中调用 cursor.setNotificationUri()?
【问题讨论】:
标签: android android-contentprovider android-contentresolver android-cursor