美文网首页
笔记(二)——RxJava零碎知识摘录

笔记(二)——RxJava零碎知识摘录

作者: 木溪bo | 来源:发表于2019-08-23 14:20 被阅读0次

    ——》个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主精华、书籍

    各自的职责:Retrofit 负责网络请求接口的封装(充当一个网络封装库,类似xUtils等库),使用接口的方式呈现;OkHttp 负责请求的过程;RxJava 负责异步、各种线程之间的切换。

    addConverterFactory:将OKHttp返回的标准Response解析成我们所需要的数据类型UserBean
    addCallAdapterFactory:将Call<UserBean>转换成Observable<UserBean>,这样才能真正将Retrofit和RxJava结合起来。

    水管式的RxJava2.0——给初学者的RxJava2.0教程

    1、在RxJava中分为被观察者(Observable),观察者(Observer),订阅(subscribe)。在Observable中ObservableEmitter发射器可以发送多条onNext()信息,在Observer中也可以接收多条,but在Observable中ObservableEmitter发射器发送多个onComplete或onError后,在Observer中只可以接收一条消息。且onComplete或onError只能同时存在一个或者说只会走一个。

    • 如果自定义多个Observable使用了concat操作符中,如果要想执行下一个Observable那么前一个Obeservable的发射器必须要执行onComplete方法。
    • concat中所有的Observable都要走完onComplete方法,不然 subscribe中的onComplete将不会执行。
    • 自定义observable中onComplete / onError方法后的onNext会发送 但是subscribe并不会接收到。

    2、subscribeOn() 指定的是上游发送事件的线程, observeOn() 指定的是下游接收事件的线程。上游可以指定了多次线程, 但只有第一次指定的有效,而下游接收事件每指定一次线程都会切换一次。

    3、最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete,也不能发多个onError,如果你的代码逻辑中违背了这个规则, 并不一定会导致程序崩溃 比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了, 但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃.。

    • 经试验
     e.onNext(response);
     e.onError(new AndroidException("error"));
     e.onComplete();
     先调用onError()->onComplete()程序正常
    
     e.onNext(response);
     e.onComplete();
     e.onError(new AndroidException("error"));
     先调用onComplete()->onError()程序异常报错
    
    • 发多个onError是不允许的,会异常报错。
     e.onNext(response);
     e.onError(new AndroidException("error1"));
     e.onError(new AndroidException("error2"));
     程序异常报错
    

    4、当使用Flowable来实现背压:
    Observable(上游 被观察者)和Observer(下游 观察者)—变成—>Flowable(上游 被观察者)和Subscriber(下游 观察者)

    • Flowable里 BackpressureStrategy.ERROR 默认有一个大小为128的水缸(即队列), 当上下游工作在不同的线程中时, 上游就会先把事件发送到这个水缸中。只有下游Subscriber中调用了Subscription.request(n),上游才会从队列中取出事件发送到下游,否则上游Flowable会认为下游没有处理能力就不会发射事件。而但上下游处在同一线程,却又没有处理能力时硬要调用e.onNext发射事件就会抛出MissingBackpressureException异常。
    • 四种策略 BUFFER,ERROR,DROP,LATEST
      Buffer:事件容器的空间不限制,非Buffer策略时事件容器大小为128
      ERROR:当事件容器溢出时会报MissingBackpressureException。该策略下,当下游累计消耗完96个事件后,才会给事件容器腾出96个位置。
      DROP: 事件容器装入128个事件后,剩下的将不会装入,当下游累计消耗完128个事件后,才会给事件容器腾出128个位置,这时再取当前时刻发送的事件装入。
      LATEST: 与DROP类似,但它会保证取到最后发射的事件
    • Subscription.request(n)是一种下游观察者响应式拉取的能力,可理解成下游处理事件的能力, 下游能处理几个就告诉上游我要几个。给初学者的RxJava2.0教程(九)

    异步: 当上下游工作在不同的线程里时,每一个线程里都有一个requested,而我们调用request(1000)时,实际上改变的是下游主线程中的requested,而上游中的requested的值是由RxJava内部调用request(n)去设置的,这个调用会在合适的时候自动触发。下游在一开始就在内部调用了request(128)去设置了上游中的值,因此即使下游没有调用request(),上游也能发送128个事件,这也可以解释之前我们为什么说Flowable中默认的水缸大小是128,其实就是这里设置的。所谓“合适的时候”就是说上游发送完默认的128个事件,接下来就会响应下游的request(96)拉取了,96是一个固定值,只有消耗完96个事件才会腾出96个空间。
    同步:同一个线程中的时候,在下游调用request(n)就会直接改变上游中的requested的值,多次调用便会叠加这个值,而上游每发送一个事件之后便会去减少这个值,当这个值减少至0的时候,继续发送事件便会抛异常了。

    异步线程中

    5、compose()操作符常用来简化多处需要复写的公共部分,比如上下游线程切换的公共部分。

    compose()是唯一一个能够从数据流中得到原始Observable的操作符,所以,那些需要对整个数据流产生作用的操作(比如,subscribeOn()和observeOn())需要使用compose()来实现。相较而言,如果在flatMap()中使用subscribeOn()或者observeOn(),那么它仅仅对在flatMap()中创建的Observable起作用,而不会对剩下的流产生影响。

    当创建Observable流的时候,compose()会立即执行,犹如已经提前写好了一个操作符一样,而flatMap()则是在e.onNext()被调用后执行,e.onNext()的每一次调用都会触发flatMap(),也就是说,flatMap()转换每一个事件,而compose()转换的是整个数据流。

    因为每一次调用onNext()后,都不得不新建一个Observable,所以flatMap()的效率较低。事实上,compose()操作符只在主干数据流上执行操作。

    6、debounce操作符:debounce原理类似于我们在收到请求之后,发送一个延时消息给下游,如果在这段延时时间内没有收到新的请求,那么下游就会收到该消息;而如果在这段延时时间内收到未来新的请求,那么就会取消之前的消息,并重新发送一个新的延时消息,以此类推。而如果在这段时间内,上游发送了onComplete消息,那么即使没有到达需要等待的时间,下游也会立刻收到该消息。
    RxJava2 实战知识梳理(3) - 优化搜索联想功能

    相关文章

      网友评论

          本文标题:笔记(二)——RxJava零碎知识摘录

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