zoukankan      html  css  js  c++  java
  • DataSetObserver猜想观察者模式

    frameworks/base/core/java/android/database/DataSetObserver.java

    此类的所有代码为:

    public abstract class DataSetObserver{

        public void onChanged(){}

        public void onInvalidated(){}

    }

    我在想,谁调用onChanged呢?对于观察者,当数据变动时调用onChanged()吧,那应该有数据变动的地方,insert / update /delete

    frameworks/base/core/java/android/widget/AdapterView.java内部类AdapterDataSetObserver继承了此类,但它也只是重写了此类中的两个方法,没有写调用关系。

    frameworks/base/core/java/android/database/DataSetObserverable.java

    此类的所有代码

    DataSetObserverable
    public class DataSetObservable extends Observable<DataSetObserver> {
        /** 
         * Invokes onChanged on each observer. Called when the data set being observed has
         * changed, and which when read contains the new state of the data.
         */
        public void notifyChanged() {
            synchronized(mObservers) {
                for (DataSetObserver observer : mObservers) {
                    observer.onChanged();
                }   
            }   
        }   
    
        /** 
         * Invokes onInvalidated on each observer. Called when the data set being monitored
         * has changed such that it is no longer valid.
         */
        public void notifyInvalidated() {
            synchronized (mObservers) {
                for (DataSetObserver observer : mObservers) {
                    observer.onInvalidated();
                }   
            }   
        }
    }
    Observable
    public abstract class Observable<T> {
        /**
         * The list of observers.  An observer can be in the list at most
         * once and will never be null.
         */
        protected final ArrayList<T> mObservers = new ArrayList<T>();
    
        /**
         * Adds an observer to the list. The observer cannot be null and it must not already
         * be registered.
         * @param observer the observer to register
         * @throws IllegalArgumentException the observer is null
         * @throws IllegalStateException the observer is already registered
         */
        public void registerObserver(T observer) {
            if (observer == null) {
                throw new IllegalArgumentException("The observer is null.");
            }   
            synchronized(mObservers) {
                if (mObservers.contains(observer)) {
                    throw new IllegalStateException("Observer " + observer + " is already registered.");
                }   
                mObservers.add(observer);
            }
    ...
    }
    BaseAdapter
    public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
        private final DataSetObservable mDataSetObservable = new DataSetObservable();
    
        public boolean hasStableIds() {
            return false;
        }
        
        public void registerDataSetObserver(DataSetObserver observer) {
            mDataSetObservable.registerObserver(observer);
        }
    
        public void unregisterDataSetObserver(DataSetObserver observer) {
            mDataSetObservable.unregisterObserver(observer);
        }
        
        /**
         * Notifies the attached View that the underlying data has been changed
         * and it should refresh itself.
         */
        public void notifyDataSetChanged() {
            mDataSetObservable.notifyChanged();
        }
        
        public void notifyDataSetInvalidated() {
            mDataSetObservable.notifyInvalidated();
        }
    ...
    }

    从类BaseAdapter中看,这里的注册和通知动作都是通过DataSetObservable对象的,而DataSetObservable继承了Observable<DataSetObserver>。

     因此,要查找那些继承自BaseAdapter,又重写了DataSetObserver的onChanged的函数。

  • 相关阅读:
    droid开发:如何打开一个.dcm文件作为位图?
    AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.
    Android 异步加载神器Loader全解析
    Android实现RecyclerView的下拉刷新和上拉加载更多
    Android之ViewFlipper的简单使用
    云计算之路-阿里云上:2014年6月11日17点遇到的CPU 100%状况团队
    云计算之路-阿里云上:黑色1秒,微软的问题还是阿里云的问题?团队
    [网站公告]18:07-18:20阿里云SLB故障造成网站不能正常访问团队
    上周热点回顾(6.2-6.8)团队
    云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存团队
  • 原文地址:https://www.cnblogs.com/jimwind/p/2875072.html
Copyright © 2011-2022 走看看