31

ContentObserver和有什么区别DatasetObserver

什么时候应该使用一个或另一个?

我得到Cursor单排。我想收到有关数据更改的通知 - 例如。当行更新时。

我应该注册哪个观察者课程?

4

4 回答 4

29

如果您使用ContentProvider(viaContentResolverActivity.managedQuery()) 来获取数据,只需将 a 附加ContentObserver到您的Cursor. 每当广播与您的光标关联的通知时,onChange()都会调用其中的代码。ContentResolverUri

Cursor myCursor = managedQuery(myUri, projection, where, whereArgs, sortBy);
myCursor.registerContentObserver(new ContentObserver() {
    @Override
    public void onChange(boolean selfChange) {
        // This cursor's Uri has been notified of a change
        // Call cursor.requery() or run managedQuery() again
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }
}

确保您ContentProvider是“好公民”并Uri在查询后使用光标注册:

cursor.setNotificationUri(getContentResolver(), uri);

它还应该通知ContentResolver底层数据的任何更改(例如,在 SQLite 数据库上的插入、删除和更新操作期间):

getContentResolver().notifyChange(uri, null);

这种方法是面向对象设计的观察者模式的一个很好的例子。

于 2011-04-13T03:43:51.493 回答
6

我不确定这个问题是否仍然在任何人的雷达上。我一直在为同样的问题苦苦挣扎一段时间。作为决定是使用 DataSet Observer 还是 ContentObserver 的试金石,我想出的方法非常简单:

如果我需要在通知中发送 URI,我会使用 ContentObserver。如果我只需要通知一个对象另一个对象已更改——我使用 DataSetObserver。

至少对我来说,分隔因素是发送通知的对象是否将其底层资源(无论是对象、记录、查询或游标)作为“通用资源标识符”暴露给应用程序的其余部分吗?或者该对象是否隐藏其数据源。

于 2016-07-27T12:34:57.560 回答
2

提供对 ptc 答案的补充,DataSetObserver用于处理Adapter中的内容更改,例如,它可以用于使用Adapter 动态更新列表视图DataSetObserver您可以使用该Adapter#registerDataSetObserver()方法注册一个。

DataSetObserver也可以用类似的方式观察Cursor中的内容变化。

于 2016-04-03T15:55:10.587 回答
1

从我开发的上一个应用程序中,我可以说。ContentObserver 和 DataSetObserver 之间的主要区别在于,ContentObserver 对 Observer 进行任何影响 ContentProvider 的更改。另一方面,DataSetObserver Observer 对数据库的任何更改影响。

于 2013-07-16T23:58:15.940 回答