閱讀737 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 使用Go代替Ruby,將服務器數量從30降到2
  下一篇:go 為什麼廣東人不看央視