Android 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,同時取消上次注冊的監聽
然後你坐等數據庫變化就可以了
最後更新:2017-04-03 22:15:45