首页 > 代码库 > ContentObserver和DataSetObserver区别

ContentObserver和DataSetObserver区别

ContentObserver和DataSetObserver区别

 

ContentObserver是一个提前通知,这时候只是通知cursor说,我的内容变化了。
DataSetObserver是一个后置通知,只有通过requery() deactivate() close()方法的调用才能获得这个通知。
 因此,最为重要的还是ContentObserver,它可以告诉你数据库变化了,当然如果你要在更新完Cursordataset之后做一些
事情,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()刷新界面