当前位置: 首页 > news >正文

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

维基百科: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类。

使用步骤

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

应用场景实例

计步器功能,在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内存泄漏总结
  • Android易混淆缩写笔记
  • Android将Log写入文件
  • Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
  • Cygwin的安装
  • Android Studio使用技巧
  • Android常用权限
  • ADB操作命令
  • Android照相机(一):调用系统相机
  • 获取RSA文件的MD5和SHA1
  • Sublime Text 3 配置
  • jQuery基础知识
  • Backbone.js简单入门范例
  • jQuery判断数组中是否包含某个元素$.inArray(js, arr);
  • sublime text3 安装Package Control
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CODING 缺陷管理功能正式开始公测
  • Fabric架构演变之路
  • javascript面向对象之创建对象
  • Object.assign方法不能实现深复制
  • SQLServer之索引简介
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 将回调地狱按在地上摩擦的Promise
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何选择开源的机器学习框架?
  • zabbix3.2监控linux磁盘IO
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 整理一些计算机基础知识!
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #{} 和 ${}区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #考研#计算机文化知识1(局域网及网络互联)
  • (06)金属布线——为半导体注入生命的连接
  • (10)STL算法之搜索(二) 二分查找
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (9)STL算法之逆转旋转
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (初研) Sentence-embedding fine-tune notebook
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (转)【Hibernate总结系列】使用举例
  • (转载)(官方)UE4--图像编程----着色器开发
  • ***检测工具之RKHunter AIDE
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET DataGridView数据绑定说明
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET运行机制
  • @private @protected @public
  • [ 转载 ] SharePoint 资料