RxJava——扩展的观察者模式
在学习RxJava的时候,经常提到观察者与被观察者,这不就是JAVA的观察者模式的运用么?是的,但是跟传统意义的上观察者模式还不太一样,所以Rxjava实际上是一种扩展的观察者模式,所以有必要对这个扩展的观察者模式做进一步的了解。
最简单的观察者模式:
对于之前写的关于Rxjava的代码先回顾一下:

但是如果我们不要修改事件,就不需要在Observable和Subscriber【它是Observer的子类】中插入Operator,那么时间Rxjava的结构如下:
Observable--->Subscriber
这看起来很像设计模式的观察者模式,但是有个重要的区别之一在于在没有Subscriber之前,Observable不会产生事件。
普通的观察者模式:
对于普通的观察者模式这里不多说,简单概念它就是:观察者(Observer)需要在被观察者(Observable)变化的一顺间做出反应。而两者通过注册(Register)或者订阅(Subscrible)的方式进行绑定。如下图所示:

RxJava--扩展的观察者模式:
而Rxjava的观察者模式跟上面普通的观察者模式差不多,但是也有几点差别:
- Observer与Observable是通过subscrible()来达成订阅关系。
- Rxjava中的事件回调有三种:onNext()、onCompleted()、onError()。
- 如果一个Observable没有任何的Observer,那么这个Observable是不会发出任何事件的。
其中关于第三点,需要说明一下,在Rxjava中其实Observable有两种形式:热启动Observable和冷启动Observable:
- 热启动Observable任何时候都会发送消息,即使没有任何观察者监听它。【它没有什么实际意义,所以说了解下既可】
- 冷启动Observable只有在至少有一个订阅者的时候才会发送消息。【所以工作中使用的都是冷启动】
RxJava的观察者模式:
相比普通观察者模式,RxJava的观察者模式如下图:

当一个事件触发时,会有一些方法回调,如下:
- onNext():基本事件。
- onCompleted()事件队列完结。RxJava不仅把每个事件单独处理,还会把它们看作一个队列,RxJava规定,当不会再有新的onNext()事件发出时,需要触发onCompleted()方法作为标志。
- onError()事件队列异常,在事件过程中出现异常时,onError()会被触发,同时队列自动终止,不允许再有事件发出。
RxJava的实现和使用【之前开篇已经有介绍过,这里再细致回顾下】:
RxJava的实现主要有如下三步:
第一步:创建观察者Observer。
第二步:创建被观察者Observable。
第三步:Subscribe(订阅)(被观察者Observable订阅观察者Observer,注意:不同于普通观察者,这里是被观察者订阅观察者)。

所以贴出之前实现过的代码:

编译运行:

这时制造一个异常再看下输出:

编译运行:

从打印中可以看出,onError()和onCompleted()是不共戴天滴。
编译运行:

那既然观察者有两个:Observer和Subscriber,那这两者有啥区别呢?当然是有区别滴,不过在未来会进行学习,这里先有个印象。
另外在Rxjava中,如果对于事件回调中,只想要onNext()方法,onError()和onCompleted()都不需要,有木有简化方案呢?当然有:

而之前我们创建Observable是通过它:

所以简化版采用just操作符来,如下:

编译运行:

下面改用Action1类来达到我们所要的需求:

编译运行:

但是!!!官方并不推荐使用该类来简化操作,因为Action1并不支持背压(BackPressure),而产生的大至原因是由于Rxjava的事件产生过快时导致,这个后面会再学习,也先有个了解既可。
RxJava——扩展的观察者模式的更多相关文章
- GitHub上最受欢迎的 5 大 Java 项目
1. Mockito Mockito 并不是无酒精混合饮料的意思.Mockito 是一个针对 Java 的 mocking 框架.它与 EasyMock 和jMock 很相似,但是通过在执行后校验什么 ...
- 78. Android之 RxJava 详解
转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...
- RxJava学习入门
RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...
- Android中使用反应式编程RxJava
GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...
- RxJava_ _学了下RxJava
之前就知道有RxJava这玩意,知道这玩意很屌,不过也就止于看看标题,看几段介绍的程度(懒癌害人不浅).这周心血来潮,抽空把之前收藏的 扔物线 大神写的RxJava入门文章看了. http://gan ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- RxJava的使用
前言 RxJava及RxAndroid比较详细的介绍可以参考该文档<给 Android 开发者的 RxJava 详解> 基本介绍 ReactiveX 及 RxJava使用大部分来自和参考& ...
- RxJava 教程-1 简介 原理 线程控制 变换
简介 RxJava 是什么? RxJava 在 GitHub 主页上的自我介绍是 RxJava is a Java VM implementation of ReactiveX: a library ...
随机推荐
- vue项目中event bus的简单使用
之前做的一个vue后台管理系统中,需要实现这样一个功能:从列表页点击新建或编辑进入新建.编辑页面,新建.编辑完成后需要关闭当前的新建和编辑tab,而tab的关闭则是由项目中的tag组件控制的, 新建和 ...
- MySQL的安装、配置与优化
MySQL 安装配置 参考网址:https://www.runoob.com/linux/mysql-install-setup.html MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL ...
- SpringBoot:SpringBoot整合JdbcTemplate
个人其实偏向于使用类似于JdbcTemplate这种的框架,返回数据也习惯于接受Map/List形式,而不是转化成对象,一是前后台分离转成json方便,另外是返回数据格式,数据字段可以通过SQL控制, ...
- [学习笔记] 在Eclips 中导出项目
有时候需要将自己完成的项目分享给别人,可以按如下步骤操作: 选择要导出的内容,设置导出的文件名. 然后点击,Finish 即可. 然后到d:\tmp 会看到文件:Hibernat_demo_001.z ...
- CentOS7安装MySQL 密码方面
1.为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 可通 ...
- VS2013:error C1069: 无法读取编译器命令行
前一阵搞python和matlab,没用VS 2013,今天打开一个C++程序想跑一跑,突然蹦出这么个错误,然后发现电脑上所有的程序都会这样了. 后来发现是TMP/TEMP环境变量路径有空格的问题,更 ...
- 《MIT 6.828 Homework 1: boot xv6》解题报告
本作业的网站链接:MIT 6.828 Homework 1: boot xv6 问题 Exercise: What is on the stack? While stopped at the abov ...
- emacs 常用命令
C stands for Ctrl and M stands for Alt REFERENCE FORM EMACS TUTORIAL 表述不一定正确,仅供参考,主要是要多实践,一开始可能会不习惯 ...
- HanLP-朴素贝叶斯分类预测缺陷
文章整理自 baiziyu 的知乎专栏,感兴趣的朋友可以去关注下这位大神的专栏,很多关于自然语言处理的文章写的很不错.昨天看到他的分享的两篇关于朴素贝叶斯分类预测的文章,整理了一下分享给给大家,文章已 ...
- Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据
Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...