美文网首页
观察者模式结合Android源码

观察者模式结合Android源码

作者: 甜牛奶苦咖啡 | 来源:发表于2016-12-16 15:28 被阅读50次

    1.观察者模式最重要的作用?

    解耦,将观察者和被观察者解耦。eg:ui层与具体的业务逻辑解耦

    2.观察者模式的定义?

    定义对象间一种一对多的依赖关系,使得每当一个对象(被观察者)状态发生改变,所有依赖他的对象(观察者)都会收到通知并自动更新。

    3.分析JDK中的Observe和Observable.

    observe是用于观察者实现的接口。里面就一个方法,用来更新。

    void update(Observable observable,Object data);

    Observable是用于被观察者来继承的类。持有观察者的集合,遍历观察者集合,调用观察者更新方法。

    List observers=new ArrayList();

    public void notifyObservers(Object data) {

    int size =0;

    Observer[] arrays =null;

    synchronized(this) {

    if(hasChanged()) {

    clearChanged();

    size =observers.size();

    arrays =newObserver[size];

    observers.toArray(arrays);

    }

    }

    if(arrays !=null) {

    for(Observer observer : arrays) {

    observer.update(this,data);

    }

    }

    }

    4.结合Android源码

    通常我们在listview添加数据后,都会调用adapter的notifyDateSetChanged()方法。notifyDateSetChanged
    方法定义在BaseAdapter中

    BaseAdapter.java

    //数据集观察者

    DataSetObservable mDataSetObservable=new   DataSetObservable();

    //当数据集变化,通知所有观察者

    public void notifyDataSetChanged() {

    mDataSetObservable.notifyChanged();

    }

    DataSetObservable.java

    遍历所有观察者,调用每个观察者的onChange方法来通知他们被观察者发生了变化

    public void notifyChanged() {

    synchronized(mObservers) {

    for(int i =mObservers.size() -1;i >=0;i--) {

    mObservers.get(i).onChanged();

    }

    }

    }

    AdapterView中有一个内部类AdapterDateSetObserver,在listview中设置adapter时,会构造一个AdapterDateSetObserver,并且注册到adapter中,这就是一个观察者,而adapter中包含一个数据集可观察者DataSetObservable,在数据集发生变化时,开发者手动调用adapter.notifyDateSetChanged,而notifyDateSetChanged实际上会调用DataSetObservable的notifyChanged方法,该方法会遍历所有的观察者的onChanged方法,onChanged方法内部获取adapter中数据集的新数量,然后调用listview的requstLayout方法重新布局,更新ui。

    相关文章

      网友评论

          本文标题:观察者模式结合Android源码

          本文链接:https://www.haomeiwen.com/subject/fnvnmttx.html