美文网首页
Rxjava-基础知识

Rxjava-基础知识

作者: wangsye | 来源:发表于2019-03-11 23:30 被阅读0次

    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的转换

    1. 使用publish,生成ConnectableObservable,将原来的Observable转换成ConnectableObservable。
    2. 使用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

    1. 使用ConnectableObservable的refCount操作符。refcount操作符把从一个可连接的Observable连接和断开过程自动化了。操作一个Observable,返回一个普通的Observable,当第一个订阅者/观察者订阅这个Observable时,RefCount连接到下层的可连接Observable,RefCount跟踪有多少个观察者订阅它,指导最后一个观察者完成,才断开与下层Observable的连接。如果所有的订阅者/观察者都取消订阅了,则数据流停止,如果重新订阅,则重新开始数据流。如果部分观察者取消订阅,则部分观察者重新订阅,则不会从头开始数据流。

    2. 使用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 发射订阅后的全部数据

    相关文章

      网友评论

          本文标题:Rxjava-基础知识

          本文链接:https://www.haomeiwen.com/subject/xtlwpqtx.html