zoukankan      html  css  js  c++  java
  • 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,同时取消上次注册的监听

    然后呢?然后就没有然后了,你坐等数据库变化就可以了

  • 相关阅读:
    内排序小结
    HTML初体验
    android动画介绍之 自己定义Animation动画实现qq抖一抖效果
    iOS 把数据库文件打包到mainbundle中,查找不到路径的解决的方法;以及在删除bundle中文件的可行性
    随着ScrollView的滑动,渐渐的运行动画View
    MFC Month Calendar Control 控件使用
    Codeforces Round #148 (Div. 1)
    Codeforces 486E LIS of Sequence(线段树+LIS)
    2014年百度之星资格赛第四题Labyrinth
    UVA10519
  • 原文地址:https://www.cnblogs.com/xiaoQLu/p/2570934.html
Copyright © 2011-2022 走看看