android - cursor.setNotificationUri() 是做什么用的?

标签 android android-contentprovider android-contentresolver android-cursor

我从 this tutorial 研究了如何使用 ContentProviders 和 Loaders

我是怎么看的: 我们有一个带有 ListViewSimpleCursorAdapterCursorLoaderActivity。我们还实现了 ContentProvider

Activity 中,我们可以通过单击按钮调用 getContentResolver().insert(URI, contentValues);

在我们的ContentProvider实现中,在insert()方法的最后,我们调用getContentResolver().notifyChange(URI, null); code> 和我们的 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);
        // ...
    }
}

但我无法理解这一点。

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

最佳答案

如果您调用 Cursor.setNotificationUri(),Cursor 将知道它是为什么而创建的 ContentProvider Uri

CursorLoader 使用 ContextContentResolver 注册自己的 ForceLoadContentObserver(扩展 ContentObserver) 为您在调用 setNotificationUri 时指定的 URI。

所以一旦 ContentResolver 知道 URI 的内容已被 更改 [这发生在你调用 getContext().getContentResolver().notifyChange(uri, contentObserver );ContentProviderinsert()update()delete() 方法中] 它会通知所有的观察者,包括 CursorLoader 的 ForceLoadContentObserver

ForceLoadContentObserver 然后将 Loader 的 mContentChanged 标记为 true

关于android - cursor.setNotificationUri() 是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21623714/

相关文章:

android - 如何垂直滚动 ConstraintLayout?

java - 从广播接收器以及应用程序访问数据库

android - 无法写入内部存储器android

android - 如何访问我在收件箱中收到的短信时间?

android - 指定为非null的参数为null:参数投影Content Provider Kotlin

android - 如何将 OK Google 语音查询连接到我的应用程序

android - 按钮 onClick 和 ListView onItemClick

android - 我应该将 .idea/caches/build_file_checksums.ser 添加到 .gitignore 吗?

android - java.lang.SecurityException : Permission Denial: reading 错误

android - 无法使用 Intent.ACTION_GET_CONTENT 从文件选择器的 native 谷歌文档中获取字节