观察者模式结合Android源码

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源码)