本文部分參考 http://www.cnblogs.com/ufocdy/archive/2011/03/17/1987327.html
主要是以簡單的語言說明cursor和cursorAdapter的監聽機制
先來講講cursor的監聽機制,
給cursor加監聽很簡單,調用cursor.registerContentOberserver()即可,然后重寫onChange()方法,這樣數據庫變化,就會回調onChange方法
背后的監聽機制是什么呢?
cursor是接口,實現應該是在AbstractCursor里面,AbstractCursor有一個ContentObservable繼承自Observable,這個就是經典的觀察者模式了,
調用這個方法后,會向這里注冊一個觀察者,來監控數據庫
現在有觀察者了,那數據庫變化,又是怎么通知過來的呢?
還記得自定義provider的時候,有一句必須要加的話不?在add和update和delete的時候--->cur.setNotificationUri(getContext().getContentResolver(), uri);
這里就是通知observer數據庫變化的,其實是通知AbstractCursor的setNotificationUri
public void setNotificationUri(ContentResolver cr, Uri notifyUri) {
synchronized (mSelfObserverLock) {
mNotifyUri = notifyUri;
mContentResolver = cr;
if (mSelfObserver != null) {
mContentResolver.unregisterContentObserver(mSelfObserver);
}
mSelfObserver = new SelfContentObserver(this);
mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);
mSelfObserverRegistered = true;
}
}
然后上面我們不是剛好通過cursor在這個AbstractCursor中加入了觀察者么?原來世界如此美好,數據庫的變化一切盡在監控之中
再來說說cursorAdapter的監聽
cursorAdapter自己內部已經做好了監聽,你想在數據庫變化后做一些改變,只要重寫onContentChanged()即可
那么它是如何監聽的呢?
其實他的機制和上面的cursor是一樣,在你調用cusoradapeter.changeCursor方法的時候,系統會調用一個cursorAdapter.registerContentObserver和registerDatasetObserver,同時取消上次注冊的監聽
然后呢?然后就沒有然后了,你坐等數據庫變化就可以了