Android中的观察者模式简单使用

观察者简单理解 : 

张三是一个保安,他每天都要监督好多车辆进进出出,车子进来了,他要开门,出去了他要关门

这个时候张三他就是一个观察者,车子就是被观察者,观察到动静做出反应,跟新数据,就是关门开门

观察者模式

“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到通知,并自动更新”,可以理解成多个观察者向一个被观察者订阅消息,当被观察者发生改变时通知相应的观察者去作自己的事情。

Android 中的观察者实现java.util.Observer接口,被观察者继承java.util.Observable类。

使用步骤

  1. 观察者实现Observer接口,重写update()方法;
  2. 被观察者继承Observable类;
  3. 观察者向被观察者订阅事件,调用addObserver()方法;
  4. 被观察者数据改变,调用setChanged()方法和notifyObservers()方法,通知观察者,观察者在update()方法里做出相应操作;
  5. 观察者向被观察者取消订阅事件
代码示例
1.观察者实现Observer接口,重写update()方法;
public class PedometerFragment extends Fragment implements Observer {

    @Override
    public void update(Observable observable, Object data) {

    }}

2.被观察者继承Observable类;
因为Java的单继承,计步Service已经继承了Service无法再继承另一个类,所以新建一个类StepObservable作为被观察者。

/**
 * 被观察者
 */
public class StepObservable extends Observable {

    //单例
    private static StepObservable instance = null;

    public static StepObservable getInstance() {

        if (null == instance) {
            instance = new StepObservable();
        }

        return instance;
    }

    //通知观察者更新数据
    public void notifyStepChange(int step) {

        //关键方法,必须写,具体实现可以查看源码
        setChanged();//设置changeFlag
        notifyObservers(step);//通知观察者
    }

}

3.观察者向被观察者订阅事件,调用addObserver()方法;
在Fragment的onResume方法中添加订阅

    /**
     * onResume
     */
    @Override
    public void onResume() {
        super.onResume();

        //观察者往被观察者中添加订阅事件
        StepObservable.getInstance().addObserver(this);
    }

4.被观察者数据改变,调用setChanged()方法和notifyObservers()方法,通知观察者,观察者在update()方法里做出相应操作;
Service中的相应代码:
private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

        //..

        //得到当前
        currentStep = step;

        //被观察者数据改变,更新数据
        StepObservable.getInstance().notifyStepChange(currentStep);

        //..

    }
}

Fragment中的相应代码,在update方法里做相应操作:

    @Override
    public void update(Observable observable, Object data) {

        int step = (int) data;
        Snackbar.make(roundProgressBar, "step=" + step, Snackbar.LENGTH_SHORT).show();
        Log.i(TAG, "step=" + step);
    }

5.观察者向被观察者取消订阅事件
在Fragment的onPause方法中添加订阅

    /**
     * onPause
     */
    @Override
    public void onPause() {
        super.onPause();

        //观察者从被观察者队列中移除
        StepObservable.getInstance().deleteObserver(this);
    }

猜你喜欢

转载自blog.csdn.net/qq_30983519/article/details/81629043