RXjava讲解

RXjava讲解_第1张图片


RXJava实现过程简介:

用两根水管代替观察者和被观察者

 RXjava讲解_第2张图片RXjava讲解_第3张图片

上面一根水管为事件产生的水管,叫它上游吧,下面一根水管为事件接收的水管叫它下游吧。

两根水管通过一定的方式连接起来,使得上游每产生一个事件,下游就能收到该事件。

这里的上游和下游就分别对应着RxJava中的Observable和Observer,它们之间的连接就对应着subscribe()。

 

RXJava大概实现原理:

create方法中new ObservableOnSubscribe,在之后的create subScribeOn,observeOn中会将这个被观察者一直传递到subScribe方法,在subScribe方法中new observe,然后subscribe方法会将观察者一级一级往上传递到ObservableEmitter,然后她会调用onNext,onError,onComplete方法。

 

Rxjava中存在flatMap以及Map他们可以将一些指定的要发送的对象类型转换为另一个需要的对象类型

flatMap以及Map对象类型变换原理:

代码中存在一个lift()方法,这个方法就是flatMap以及Map能够转换对象类型的关键。通过这个lift方法会创建一个新的observable,这个observable里面包含一个新的OnSubscribe,一个新的subscriber原始的onSubscribe方法会发送数据发送到这个新的Subscriber中,而在这个新的Subscriber中会对数据进行一个处理,处理完成之后再发送给目标订阅者,也就是最原始的observer。

 

RXJava线程切换原理:

线程的切换其实也是使用了lift方法,被观察者(子线程)切换线程使用observeOn()观察者(主线程)切换线程使用subscriberOn(),可切换为多种线程,例如主线程,IO线程,新线程等等

Schedulers.immediate():直接在当前线程运行,相当于不指定线程。

Schedulers.newThread():总是启用新线程,并在新线程执行操作。

Schedulers.io():行为模式和 newThread() 差不多,区别在于 io() 的内部实现是用一个无数量上限的线程池,可以重用空闲的线程

Schedulers.computation():指的是 CPU 密集型计算

 

observeOn() 源码中调用lift方法后,会创建一个onSubscribe和一个新的subscriber。新的onSubscribe会通知原始的onSubscribe,原始的在收到通知后就会把信息发送到新的subscriber中,而这个时候如果设置了切换线程的话就会发生切换线程的操作

subscribeOn() subscribeOn()方法就不同了,它切换线程的位置是在新onSubscribe通知原始onSubscribe之前,这也就导致了如果设置了多个切换线程操作始终只有有第一个subscribeOn()方法切换成功

 

subscribeOn切换观察者的线程为什么要设置在整个流程之前而为什么observeOn方法会设置到整个流程之间?

subscribeOn是影响生产者(Observable)生产数据的线程的,通常我们只需要指定生产者在某一个特定的线程生产数据就可以满足我们的需求绝大多数我们需要变化线程的场景都是在数据生产之后消费者可以任意切换自己接受处理数据的线程,足以满足我们的需求。

 


你可能感兴趣的:(Android)