Android:ContentObserver selfChange

mat*_*ous 4 android

在ContentObserver类中,方法onChange传递一个布尔值selfChange,定义为:"如果更新是由对正在观察的光标的提交调用引起的,则为true."

更新光标以使selfChange设置为true的正确方法是什么?我当前的代码根本没有引用光标进行更新,因此selfChange总是为false.

ContentValues values = new ContentValues();
values.put("date", date.getTime());
getContentResolver().update(URI, values, "_id = " + id, null);
Run Code Online (Sandbox Code Playgroud)

Xia*_*iao 5

Android框架没有提供通过静态ContentResolver#update()方法执行此操作的方法.

说明

ContentResolver#notifyChange(Uri,ContentObserver)使用ContentObserver对象作为启动更改的观察者调用时,ContentObserveronChange()调用selfChangeset为true

来自文档:

void android.content.ContentResolver.notifyChange(Uri uri,ContentObserver observer)

参数:

uri已更改内容的uri.

observer发起更改的观察者可能为null.发起更改的观察者只有在通过实施ContentObserver.deliverSelfNotifications()以请求接收自我更改通知才会收到通知.

因此,如果您notifyChange()ContentProvider更新/插入/删除方法中调用,而这些方法又是从ContentResolver更新/插入/删除方法调用的,那么您将没有ContentObserver传递给的引用notifyChange(),因此不会selfChange设置为true.

解决方法

如果ContentProvider与客户端代码处于同一进程中,则此方法有效.它需要一个自定义的ContentProvider和一个更复杂/容易出错的调用update/insert/delete方法.

我们可以在派生ContentProvider中创建自定义方法,将其ContentObserver作为参数.例如,如果我们想要使用update()方法调用notifyChange(),ContentObserver我们会执行以下操作:

public class MyContentProvider extends ContentProvider {

    @Override
    public int update(Uri uri, ContentValues values, String selection, 
                String[] selectionArgs) {
        // Just call our new method with 'null' as the ContentObserver
        update(uri,values,selection,selectionArgs,null);
    }

    public int update(Uri uri, ContentValues values, String selection, 
                String[] selectionArgs, ContentObserver changeOriginator){
        // Do the update
        ...
        // Notify the change with the ContentObserver that wants to ignore it
        getContext().getContentResolver().notifyChange(uri,changeOriginator);
}
Run Code Online (Sandbox Code Playgroud)

要使用新方法,您必须从中获取ContentProvider对象ContentResolver并调用我们的新update()方法:

ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider();
MyContentProvider mCP = (MyContentProvider)cP;
mCP.update(URI, values, "_id = " + id, null, contentProvider);
Run Code Online (Sandbox Code Playgroud)


rog*_*gcg 0

嘿,我遇到了同样的问题。你的 onChange() 方法工作正常吗?您必须在 onChange() 方法范围内调用您想要执行的操作。

我就是这么做的,而且效果很好!当光标发生某些变化时它会发出通知。