Rxjava3序言
Rxjava3
Rxjava其实在很早以前有过学习和了解,但是当时由于没有记笔记的习惯,难以整理成体系化的笔记,零零散散。
本系列笔记学习基于
io.reactivex.rxjava3:rxjava:3.1.6
概念
RP
RP即
Reactive Programming
(响应式编程)
所谓的响应式即变化是可传播的,即发生变化后这种变化会如同”病毒“一样扩散出去。
假如计算一个式子
c = a + b
命令式和响应式写法如下
None RP
1 | public class NoneRP { |
RP
1 | public class RP { |
RX
RX是什么意思?
RX(ReactiveX或Reactive Extensions)即响应式扩展,即用于实现响应式编程的框架
响应式的核心是设计模式中的观察者模式。
除此之外还切分了上下游关系,下游观察上游,上游向下游发送事件
R是一种思想即上文所述RP
RX是实现响应式的一种框架
是一个用于解决异步事件的编程库
它使用了观察者模式,并且有很多的操作符可以以声明式的方式将不同的流组合在一起。
同时他封装了线程,同步,线程安全,并发容器,非阻塞式IO
Rxjava
Rxjava是ReactiveX对于指定编程语言的实现
类似的还有
- RxJs
- Rx.NET
- RxScala
- RxClojure
- RxSwift
- RxCpp
- RxLua
- Rx.rb
- RxPY
……
Why Rxjava
callback存在问题
Callback解决了异步调用,阻塞的问题,但是由于异步需要嵌套一层回调。加大了编程效率。
rxjava灵活
- 可以指定数据流的线程
- 可以指定数据流的顺序
- 支持异步eventloop nio
提供了大量的操作符用于支持响应式编程
版本变动
Rxjava经历了3个版本的变动
1.X
2018 3/13官方宣布停止更新,不再推出新版本。版本定格在1.3.8。
No further development, support, maintenance, PRs and updates will happen
2.X
2021 2/28官方宣布停止更新。最后版本定格在2.2.21
3.X
目前最新版本,功能最为强大。
内容
在Rx中包含如下角色
Observable
即可观测的,可以被观察的。被观察者。在rx中观察观测被观察者(即Observable),被观察者可以向观察者发送一系列事件。
Single
一个只能发送一个事件的被观察者。(即一次性的Observable)
Subject
是观察者和被观察者的桥梁,既是一个观察者,也是一个被观察者,既可以发送数据也可以接受数据。
Operator
操作符,为是一系列功能的集合。
Scheduler
即调度器,为Observable添加多线程的调度支持。
RxJava项目结构结构
项目依赖
The purpose of Reactive Streams is to provide a standard for asynchronous stream processing with non-blocking backpressure.
Reactive Streams的目的在于提供非阻塞式背压 异步流处理的标准
所谓标准既是一套抽象。(说人话就是一套接口)
项目公共API
即除internal包外的所有包
1 | module io.reactivex.rxjava3 { |
抽象
Maybe
,Observable
,Single
,Completable
的结构类似均包含如下抽象
XXXSource
可观测的数据源,通常是XXX的抽象,比如ObservableSource是Observable的抽象
XXXObserver
订阅关系中,下游需要在subscribe过程向上游传输观察者
XXXEmitter
订阅关系在,上游需要向下游发送事件,而这一部分内容由上游的Emitter实现
XXXOnSubscribe
订阅关系中的最上游。
XXXOperator
对下游的observer进行包裹hook。(
lift
操作符)XXXTransformer
对上游的数据源进行转换(
compose
操作符)XXXConverter
转换器,将数据源进行转换。(
to
操作符)
Flowable
支持背压(即实现了reactive stream规范),所以结构上有一定的差异
Publisher
同XXXSource,是Flowable的抽象
FlowSubscriber
同Observer是一个订阅者,需要在订阅过程中向上游传输。
FlowEmitter
FlowOnSubscribe
FlowOperator
FlowTransformer
FlowConverter