观察者模式应用在Gridview、Adapter原理解析

来源:互联网 发布:linux中sed命令详解 编辑:程序博客网 时间:2024/06/05 14:37

这里写图片描述

划分成分:

控件View
GirdView –> AbsListView –> AdapterView
适配器Adapter
BaseAdapter –> Adapter
观察者Observer
AdapterDataSetObserver –> DataSetObserver
被观察者Observable
DataSetObservable –> Observable

场景:GridView中必不可少的Adapter,在我们改变item后,我们都会调用一个方法: notifyDataSetChanged()进行刷新效果,这个方法就是用到了我们所说的观察者模式

思路:在GridView的setAdapter中,外部引入adapter对象,并new出一个观察者对象mDataSetObserver。以adapter为桥梁间接实现观察者、被观察者的订阅–发布。

View部分:

GridView的setAdapter方法

    @Override    public void setAdapter(ListAdapter adapter) {        if (mAdapter != null && mDataSetObserver != null) {            mAdapter.unregisterDataSetObserver(mDataSetObserver);        }        resetList();        mRecycler.clear();                mAdapter = adapter;        //代码省略...        if (mAdapter != null) {            //代码省略...            //GridView父类的内部类            mDataSetObserver = new AdapterDataSetObserver();//新的观察者对象            mAdapter.registerDataSetObserver(mDataSetObserver);//注册观察者            //代码省略...        } else {            //代码省略...        }        requestLayout();    }

Adapter部分:

BaseAdapter通过DataSetObservable间接实现:1 对观察者的注册、解绑;2 观察者方法调用

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {    // 数据集观察者    private final DataSetObservable mDataSetObservable = new DataSetObservable();    // 代码省略    //注册观察者    public void registerDataSetObserver(DataSetObserver observer) {        mDataSetObservable.registerObserver(observer);    }    //解绑观察者    public void unregisterDataSetObserver(DataSetObserver observer) {        mDataSetObservable.unregisterObserver(observer);    }    /**     * 遍历观察者对象     * 当数据集用变化时通知所有观察者     */    public void notifyDataSetChanged() {        mDataSetObservable.notifyChanged();    }}

Adapter : BaseAdapter父类

public interface Adapter {    /**     * 注册     */    void registerDataSetObserver(DataSetObserver observer);    /**     * 解绑     */    void unregisterDataSetObserver(DataSetObserver observer);    //代码省略...}

Observable部分:

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>();    /**     * 注册观察者observer     */    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);        }    }    /**     * 解绑观察者observer     */    public void unregisterObserver(T observer) {        if (observer == null) {            throw new IllegalArgumentException("The observer is null.");        }        synchronized(mObservers) {            int index = mObservers.indexOf(observer);            if (index == -1) {                throw new IllegalStateException("Observer " + observer + " was not registered.");            }            mObservers.remove(index);        }    }    //代码省略}

DataSetObservable 实现对观察集合遍历,并调用其方法

public class DataSetObservable extends Observable<DataSetObserver> {    /**     * 遍历观察者集合,执行观察者onChanged()方法     */    public void notifyChanged() {        synchronized(mObservers) {            // since onChanged() is implemented by the app, it could do anything, including            // removing itself from {@link mObservers} - and that could cause problems if            // an iterator is used on the ArrayList {@link mObservers}.            // to avoid such problems, just march thru the list in the reverse order.            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onChanged();//observer的onChanged()            }        }    }    /**     * 遍历观察者集合,执行观察者onInvalidated()方法     */    public void notifyInvalidated() {        synchronized (mObservers) {            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onInvalidated();//observer的onInvalidated()            }        }    }}

观察者DataSetObserver需要被实现两个方法

public abstract class DataSetObserver {    public void onChanged() {        // Do nothing    }    public void onInvalidated() {        // Do nothing    }}

简单概括:
View
得到adapter和observer,observer注入adapter中;实现observer的方法
Adapter
得到observable和observer,把observer注入到observable
Observable
对observer集合统一管理;对observer方法的触发

参考:http://blog.csdn.net/u012124438/article/details/55294914/

原创粉丝点击