阅读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 为什么广东人不看央视