gpt4 book ai didi

安卓:ContentObserver selfChange

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:52 32 4
gpt4 key购买 nike

在 ContentObserver 类中,方法 onChange 被传递一个 bool 值 selfChange,它被定义为:“如果更新是由对正在观察的游标上的提交调用引起的,则为真。”

更新游标以使 selfChange 设置为 true 的正确方法是什么?我当前的代码根本不引用游标进行更新,因此 selfChange 始终为 false。

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

最佳答案

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

解释

ContentResolver#notifyChange(Uri,ContentObserver)ContentObserver 调用作为发起更改的观察者对象,ContentObserver会有onChange()selfChange 调用设置为真

来自文档:

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

Parameters:

uri The uri of the content that was changed.

observer The observer that originated the change, may be null. The observer that originated the change will only receive the notification if it has requested to receive self-change notifications by implementing ContentObserver.deliverSelfNotifications() to return true.

所以如果你调用 notifyChange()来自你的 ContentProvider依次从 ContentResolver 调用的更新/插入/删除方法更新/插入/删除方法,你不会有 ContentObserver引用传递给 notifyChange()所以不会有 selfChange设置为真。

解决方法

如果 ContentProvider 与客户端代码在同一个进程中,这将起作用。它需要自定义 ContentProvider 和更复杂/更容易出错的更新/插入/删除方法调用。

我们可以在派生的 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);
}

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

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

关于安卓:ContentObserver selfChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288434/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com