Rx系列二 | Observer | Observable
Rx系列二 | Observer | Observable
上节课我们对RX的一些基本概念和使用JAVA代码实现了一个观察者,但是这只是对思路的一个讲解,在我们JAVA中,其实是已经封装好了观察者对象的,就是Observer和Observable,因为RxJava和RxAndoird都会比较依赖这个,所以我们先把原生的讲解一下,那我们再模拟一次观察和被观察,我先写一个
Observable
import java.util.Observable;
/*
*项目名: RxSample
*包名: com.liuguilin.rxsample.observable
*文件名: ObServableTest
*创建者: LGL
*创建时间:2016/12/3111:13
*描述: 被观察者
*/
public class ObServableTest extends Observable {
private int data = 0;
public int getData() {
return data;
}
public void setData(int data) {
if(this.data != data){
this.data = data;
//发生改变,update方法调用
setChanged();
//通知观察者
notifyObservers();
}
}
}
我们仔细来看这段被观察者的代码,我定义了一个data的变量,并且实现了他的set/get方法,不过我在他的set方法里做了调整,当你当前的data和set进来的数据不相同的时候,我就调用setChanged这个方法,同时通过notifyObservers方法来通知观察者,观察者就会调用update的方法,那我们来看一下观察者都做了什么
Observer
import java.util.Observable;
import java.util.Observer;
/*
*项目名: RxSample
*包名: com.liuguilin.rxsample.observable
*文件名: ObserverTest
*创建者: LGL
*创建时间:2016/12/3111:18
*描述: 观察者
*/
public class ObserverTest implements Observer {
public ObserverTest(ObServableTest obServableTest) {
//监听
obServableTest.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.print("data is changed:" + ((ObServableTest)o).getData() + "\n");
}
}
观察者这里实现了Observer,然后他的构造方法里会传递一个被观察者,通过obServableTest.addObserver(this);的方法将观察者和被观察者订阅在一起,并且重写了update方法,我们的思路就是这样,我们现在实现一个Test类
Test
/*
*项目名: RxSample
*包名: com.liuguilin.rxsample.observable
*文件名: Test
*创建者: LGL
*创建时间:2016/12/3111:22
*描述: 测试
*/
public class Test {
public static void main(String [] args){
//被观察者
ObServableTest obServableTest = new ObServableTest();
//观察者
ObserverTest observerTest = new ObserverTest(obServableTest);
obServableTest.setData(1);
obServableTest.setData(2);
obServableTest.setData(2);
obServableTest.setData(3);
}
}
在测试类中,我们实现了观察者和被观察者的订阅,同时,开始setdata,你细心的话,会发现,当setdata(1)的时候,实际上默认为0,所以状态改变了,会输出的,然后这个data就是1了,你再setdata(2),也会改变,现在默认就是2了,你再调用setdata(2)就不会触发update了,以此类推,实际上,会调用三次,那到底对不对呢,我们看一下输出
恩 没错,就是这样,是不是很简单,到这里,我相信你对一个基本的观察和订阅有了一个简单的认识,但是这个只是简单的演示,实际上只是让你有一个思想准备而已,别急,我们下篇上正餐!
Sample下载:系列最后一篇提供
系好安全带,上车了:555974449
Rx系列二 | Observer | Observable的更多相关文章
- RX系列四 | RxAndroid | 加载图片 | 提交表单
RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较 ...
- RX系列一 | ReactiveX根源 | 观察者模式分析
RX系列一 | ReactiveX根源 | 观察者模式分析 Rx的响应式编程算是很火了,对吧,但是我的工作基本上就不会接触,所以学习的比较晚,到现在才分享给大家,我们一点点的去学,当你看完这整个系列的 ...
- Rx系列---响应式编程
Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一 ...
- RX系列三 | RxJava | create | from | interval | just | range | filter
RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...
- RxSwiftライブラリの作り方 〜Observer/Observable編〜
RxSwiftライブラリの作り方をご紹介します.一つの記事ですべてを説明するのは非常に厳しいので.まず Observer や Observable といった基本的なコンポーネントとその周辺について.ひ ...
- 手牵手,从零学习Vue源码 系列二(变化侦测篇)
系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- flask 操作mysql的两种方式-sql操作
flask 操作mysql的两种方式-sql操作 一.用常规的sql语句操作 # coding=utf-8 # model.py import MySQLdb def get_conn(): conn ...
- vue-router详解——小白速会
一.概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用. vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来. ...
- CSS3和H5的新特性
H5的新特性 1. 用于绘画 canvas 元素. 2. 用于媒介回放的 video 和 audio 元素. 3. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不 ...
- java中的内部类概念
内部类和外部类可以互相访问私有属性 1.普通内部类实例化方式 外部类.内部类 对象 = new 外部类().new 内部类(); class Outer{//外部类 private String ms ...
- angularjs中的几种工具方法
1.比较两个字符串是否相等 2.对象形式转化成json和json转化成字符串形式 3.便利对象遍历数组 4.绑定数据 5.多个app功能模块的实现 <!doctype html><h ...
- CentOS6.9安装
我安装在VM的虚拟机中.具体安装方式网上很多,由于本机只能安装32位的linux系统,所以悬在了Centsos6.9版本.点此下载. 其中有一种是叫做LIVEDVD的版本,这种的值虚拟机中配置后,打开 ...
- [NOI 2010]航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- bzoj2535 [Noi2010]航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- 空间漫游(SAC大佬的测试)
题目描述由于球哥和巨佬嘉诚交了很多保护费,我们有钱进行一次 d 维空间漫游.d 维空间中有 d 个正交坐标轴,可以用这些坐标轴来描述你在空间中的位置和移动的方向.例如,d = 1 时,空间是一个数轴, ...
- hdu 5724 SG+状态压缩
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...