android cursor和cursoradapter的監聽機制


本文部分參考 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,同時取消上次注冊的監聽

然后呢?然后就沒有然后了,你坐等數據庫變化就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM