ContentObserver是一个提前通知,这时候只是通知cursor说,我的内容变化了。
DataSetObserver是一个后置通知,只有通过requery() deactivate() close()方法的调用才能获得这个通知。
因此,最为重要的还是ContentObserver,它可以告诉你数据库变化了,当然如果你要在更新完Cursor的dataset之后做一些
事情,datasetObserver也是必需的。
附上CursorAdapter部分源码:
protected void onContentChanged() {
if (mAutoRequery && mCursor != null && !mCursor.isClosed()) {
if (Config.LOGV) Log.v("Cursor", "Auto requerying " + mCursor + " due to update");
mDataValid = mCursor.requery();
}
}
private class ChangeObserver extends ContentObserver {
public ChangeObserver() {
super(new Handler());
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
onContentChanged();
}
}
private class MyDataSetObserver extends DataSetObserver {
@Override
public void onChanged() {
mDataValid = true;
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
mDataValid = false;
notifyDataSetInvalidated();
}
}
1、ChangeObserver 监听到数据库变化,执行onContentChanged()方法中mCursor.requery()
2、MyDataSetObserver 监听mCursor数据集改变, notifyDataSetChanged()刷新界面
ContentObserver和DataSetObserver区别,布布扣,bubuko.com
ContentObserver和DataSetObserver区别
原文地址:http://www.cnblogs.com/zhaojianhua/p/3842990.html