1. ContentObserver
ContentObserver主要是通過Uri來監測特定的Databases的表,如果該Databases表有變動則會通知更新cursor中的數據。
如果使用ContentProvider操作數據庫,在ContentProvider的query()方法中會通過Cursor.setNotificationUri()註冊uri描述的表,在insert,delete,query操作之後都會調用getContext().getContentResolver().notifyChange()。是當uri描述的db表中有insert,delete,query操作之後,notifyChange()會通知該cursor註冊的ContentObserver,並調用ContentObserver的onChange方法。CursorAdapter的onChange一般會調onContentChanged,在onContentChanged中調用Cursor.requery()來更新cursor中的數據。
用途:database table中有變動後通知用戶刷新cursor中的數據。
2. DatasetObserver
DatasetObserver主要是當註冊它的cursor中發生變動時會調用其中的方法,讓用戶做一些界面刷新等操作。
首先cursor通過registerDataSetObserver()註冊DatasetObserver 當cursor數據有變動時,例如調用了cursor的requery(),會調用cursor的onChanged通知用戶cursor中的內容有變動,用戶可以在onChanged裏做一些刷新界面的操作。一般會在onChanged裏調用notifyDataSetChanged通知framework,framework收到通知會調用CursorAdapter的getView來做界面刷新等工作。
用途:cursor中的數據有變動時通知用戶刷新界面。