rxjava
五种观察者模式
被观察者 | 观察者 | 描述 |
---|---|---|
Observable | Observer | 能够发射0或n个数据,并以成功或失败结束 |
Flowable | Subscriber | 能够发射0或n个数据,并以成功或失败结束。支持背压,可以控制数据源的发射速度 |
Single | SingleObserver | 只发射单个数据或错误事件 |
Comletable | CompleteableObserver | 从来不发射数据,只处理onComplete和onError事件,可以看成Rx的Runnable |
Maybe | MabyeObserver | 能够发射0或1个数据,要么成功,要么失败,有点类似于Optional |
do操作符
do操作符给Observable的声明周期的各个阶段加上一些列的回调监听。
下表总结了一些常用的do操作符,按照执行的顺序。
操作符 | 描述 |
---|---|
doOnSubscribe | 一旦观察者订阅了Observable,它就会被调用 |
doOnLifeCycle | 可以在观察者订阅之后,设置是否取消订阅 |
doOnNext | 它产生的observable每发射一项数据就会调用它一次,它的Consumer接受发射的数据项。一般用于在subscribe之前对数据进行处理 |
doOnEach | 它产生的Observable没法涉一项数据就会调用它一次,不仅包括onNext,还包括onError和onCompleted |
doOnAfterNext | 在onNext之后执行,而doOnNext在onNext之前执行 |
doOnComplete | 它产生的Observable在正常终止调用onComplete时被调用 |
doFinally | 当它产生的Observable终止之后会被调用,无论是正常终止还是异常终止。doFinally优先doAfterTerminate的调用 |
doAfterTerminate | 注册一个Action,当Observable调用onComplete或onError时触发 |
Observable分类
observable分为Hot和Cold。
Hot Observable无论有没有观察者进行订阅,事件始终会发生。当Hot Observable有多个订阅者时,Hot Observable与订阅者们的关系是一对多的关系,可以与多个订阅者共享信息。
Cold Observable是只有观察者订阅了,才开始执行发射数据流的代码。并且Cold Observable和Observer只能是一对一的关系。当有多个不同的订阅者时,消息是重新完整发送的。也就是说对Cold Observable而言,有多个Observser的时候,他们各自的消息是独立的。
Cold Observable
Observable的just,create,range,fromXXX等操作符都能生成Cold Observable。
Cold Observable和Hot Observable的转换
- 使用publish,生成ConnectableObservable,将原来的Observable转换成ConnectableObservable。
- 使用Subject/Processor。Subject和Processor作用相同,Processor是RxJava 2.x新增的类,继承自Flowable,支持背压控制(Back Presure),而Subject则不支持背压控制。Subject既是Observable又是Observer。Subject作为观察者,可以订阅目标Cold Observable,使对方开始发送事件,同时它又作为Observable转发或者发送新的事件,让Cold Observable借助Subject转换为Hot Observable。Subject不是线程安全的,如果想要线程安全,则需要调用toSerialized()。
热Observable转为Cold Observable
-
使用ConnectableObservable的refCount操作符。refcount操作符把从一个可连接的Observable连接和断开过程自动化了。操作一个Observable,返回一个普通的Observable,当第一个订阅者/观察者订阅这个Observable时,RefCount连接到下层的可连接Observable,RefCount跟踪有多少个观察者订阅它,指导最后一个观察者完成,才断开与下层Observable的连接。如果所有的订阅者/观察者都取消订阅了,则数据流停止,如果重新订阅,则重新开始数据流。如果部分观察者取消订阅,则部分观察者重新订阅,则不会从头开始数据流。
-
使用share操作符。share操作符封装了publish().refCount()调用。不需要再调用connect方法,直接使用share方法即可。
Flowable
RxJava2.x新增,支持背压。
Maybe,Single,Completable
Single
只有onSUccess,onError事件。onSuccess用于发射数据,且只能发射一个数据,后续数据抛弃。
Subject
Subject既是Observable又是Observer。分为AsyncSubject,BehaviorSubject,ReplaySUbject,PublishSubject。
Subject | 发射行为 |
---|---|
AsyncSubject | 不论订阅发生在什么时候,只发射最后一个数据 |
BehaviorSubject | 发射订阅前的一个数据,和订阅之后的全部数据 |
ReplaySubject | 不论什么时候订阅,都发射全部数据 |
PublishSubject | 发射订阅后的全部数据 |
网友评论