ContentObserver
和有什么区别DatasetObserver
?
什么时候应该使用一个或另一个?
我得到Cursor
单排。我想收到有关数据更改的通知 - 例如。当行更新时。
我应该注册哪个观察者课程?
ContentObserver
和有什么区别DatasetObserver
?
什么时候应该使用一个或另一个?
我得到Cursor
单排。我想收到有关数据更改的通知 - 例如。当行更新时。
我应该注册哪个观察者课程?
如果您使用ContentProvider
(viaContentResolver
或Activity.managedQuery()
) 来获取数据,只需将 a 附加ContentObserver
到您的Cursor
. 每当广播与您的光标关联的通知时,onChange()
都会调用其中的代码。ContentResolver
Uri
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);
这种方法是面向对象设计的观察者模式的一个很好的例子。
我不确定这个问题是否仍然在任何人的雷达上。我一直在为同样的问题苦苦挣扎一段时间。作为决定是使用 DataSet Observer 还是 ContentObserver 的试金石,我想出的方法非常简单:
如果我需要在通知中发送 URI,我会使用 ContentObserver。如果我只需要通知一个对象另一个对象已更改——我使用 DataSetObserver。
至少对我来说,分隔因素是发送通知的对象是否将其底层资源(无论是对象、记录、查询或游标)作为“通用资源标识符”暴露给应用程序的其余部分吗?或者该对象是否隐藏其数据源。
提供对 ptc 答案的补充,DataSetObserver
用于处理Adapter中的内容更改,例如,它可以用于使用Adapter 动态更新列表视图。DataSetObserver
您可以使用该Adapter#registerDataSetObserver()
方法注册一个。
DataSetObserver
也可以用类似的方式观察Cursor中的内容变化。
从我开发的上一个应用程序中,我可以说。ContentObserver 和 DataSetObserver 之间的主要区别在于,ContentObserver 对 Observer 进行任何影响 ContentProvider 的更改。另一方面,DataSetObserver Observer 对数据库的任何更改影响。