——》个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主精华、书籍
各自的职责: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) - 优化搜索联想功能
网友评论