【问题标题】:In what circumstances is uri passed to Android's ContentObserver.onChange() callback?在什么情况下 uri 被传递给 Android 的 ContentObserver.onChange() 回调?
【发布时间】:2013-09-24 20:49:16
【问题描述】:

Android 的 ContentObserver 类的 onChange() 方法说:“在可用时包括更改的内容 Uri。” URI 在什么情况下可用?什么情况下不可用?

uri 参数是在 API 级别 16 (Android 4.1) 中添加的,因此我希望它会在 Android 4.1 和更高版本中设置。但是,我在 Android 4.3 上看到了一个未设置 uri 的案例。

方法 1:有效

MyContentObserver.onChange() 被调用并传递了一个有效的 uri:

contentResolver.registerContentObserver(myUri, true, new MyContentObserver());

方法 2:不起作用——为什么不呢?

MyContentObserver.onChange() 被调用,但 uri 参数为空:

contentResolver.query();
cursor.registerContentObserver(new MyContentObserver);

这是预期的吗?其中一个是否优于另一个?我已经使用“content://com.google.android.gm/me@example.com/labels”和我自己的自定义 ContentProvider 对此进行了测试。

【问题讨论】:

  • 我只是偶然发现了同样的事情,可能是一个错误。我选择了你的方法 1。

标签: android android-contentprovider contentobserver


【解决方案1】:

这是一个老问题,但仍然没有答案。所以我会添加我的答案,以防人们仍然对此感到好奇。

当您的内容提供者使用getContext().getContentResolver().notifyChange(URI, "your_uri"); 通知注册的观察者时,它会向ContentResponder 请求它。该方法的返回值是您使用内容响应程序的registerContentObserver() 方法注册的ContentObserver,这就是您在第一种情况下所做的。但是,在第二种情况下,您使用CursorregisterContentObserver() 方法在Cursor 中注册了观察者,因此ContentResponder 不知道它。

【讨论】:

    【解决方案2】:

    如果您在公共表(例如人员、媒体提供者等)上设置ContentObserver,那么很遗憾,您可能不会收到任何Uri 作为参数,它可能是空白的,因为它取决于内容提供者的底层实现。要在更改时收到有效的Uri,必须修改相应的ContentProvider,以便与URI 一起通知更改。

    例如getContext().getContentResolver().notifyChange(Uri, "your_uri"); // 这会通知所有已注册的ContentObserverUri 已修改的相关数据集。

    如果您正在编写自己的ContentProvider,那么每当您对数据库执行更新、删除或插入操作时,请使用上述行。

    【讨论】:

    • 知道为什么 cursor.registerContentObserver() 总是给出一个空 uri(即使 ContentPRvider 使用 uri 调用 notifyChange() )?这是预期的吗?
    • @MarkDoliner 在 ContentObserver 的文档中指出,带有 URI 参数的 onChange() 版本仅在 API 16(Android 4.1)及更高版本中。也许这就是你的问题。
    • 我认为这可能不是我看到的具体问题的原因,因为我正在使用 4.3 进行测试。
    猜你喜欢
    • 2014-06-03
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多