Android中的观察者模式简单使用
16lz
2021-01-26
维基百科:https://zh.wikipedia.org/wiki/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F
参考博客:http://blog.csdn.net/feiduclear_up/article/details/42167487
观察者模式
“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到通知,并自动更新”,可以理解成多个观察者向一个被观察者订阅消息,当被观察者发生改变时通知相应的观察者去作自己的事情。
Android 中的观察者实现java.util.Observer接口,被观察者继承java.util.Observable类。
使用步骤
- 观察者实现Observer接口,重写update()方法;
- 被观察者继承Observable类;
- 观察者向被观察者订阅事件,调用addObserver()方法;
- 被观察者数据改变,调用setChanged()方法和notifyObservers()方法,通知观察者,观察者在update()方法里做出相应操作;
- 观察者向被观察者取消订阅事件。
应用场景实例
计步器功能,在Service里中有动态改变的step步数变量,而在Activity(或Fragment)中需要动态监听步数的变化更新UI,这时选择使用观察者模式。Activity(或Fragment)为观察者,Service中的step变量为被观察者。
效果展示
代码示例
1.观察者实现Observer接口,重写update()方法;
public class PedometerFragment extends Fragment implements Observer { @Override public void update(Observable observable, Object data) { }}
2.被观察者继承Observable类;
因为Java的单继承,计步Service已经继承了Service无法再继承另一个类,所以新建一个类StepObservable作为被观察者。
/** * 步数被观察者 * * Created by waka on 2016/3/2. */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); }
源码地址
自己写的一个Android计步器项目
https://github.com/BadWaka/WakaPedometer
更多相关文章
- Android入门笔记 - 网络通信 - HttpClient
- Android(安卓)应用程序退出的四种方法
- 查看Android系统内存使用的方法
- Android获取屏幕或View宽度和高度的方法
- Android的短信接收类
- 【Android】 分享一个完整的项目,适合新手!
- android琐碎问题拾计
- Android(安卓)第三章 第二节 多线程 ( AsyncTask )
- android viewgroup 的事件传递机制学习笔记