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

2019-08-23  本文已影响0人  木溪bo

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

各自的职责: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只能同时存在一个或者说只会走一个。

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()程序异常报错
 e.onNext(response);
 e.onError(new AndroidException("error1"));
 e.onError(new AndroidException("error2"));
 程序异常报错

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

异步: 当上下游工作在不同的线程里时,每一个线程里都有一个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) - 优化搜索联想功能

上一篇下一篇

猜你喜欢

热点阅读