RxJava2-map操作符源码解析

RxJava2的map操作符用于对输入对象进行转换。

RxJava2-map操作符源码解析
map操作图

下图所示为将String的输出转化为Integer的场景。

RxJava2-map操作符源码解析
String转Integer

Map的源码解析如下,首先涉及到以下几个类:

1、Observable:被观察者,通过Observable.create创建一个被观察者,即观察者模式里面的主题Subject对象。被观察者对象通过ObservableEmitter发送消息给观察者

2、ObserverOnSubscriber:类似于观察者模式中的用来通知被观察者的notifyObserver接口。

3、Observer:观察者实现类

4、subscriber方法:订阅,Observer观察者订阅Observable内容。

5、ObservableCreate:调用Observerable.create生成的类。

6、ObservableMap:调用map后生成的对象。

7、Function:将String转化为Integer的函数。

8、MapObserver:map后再subscribe生成的观察者,内部保存了原始的观察者,和Funcation函数。

下图所示的最基本的Map操作符用法涉及到的基本类。

RxJava2-map操作符源码解析
基本的类

下图所示为map操作符的调用序列图:

RxJava2-map操作符源码解析
map操作序列图

1、Observable.create(ObservableOnSubscribe)会创建ObservableCreate对象,并将ObservableOnSubscribe赋值给ObservableCreate的source变量。

2、Observable.map(Function),此时实际的Observable是ObservableCreate对象,map会创建ObservableMap对象,并将ObservableCreate赋值给source变量,将Function函数赋值给function变量。

3、Observable.subscribe(Observer),此时实际的Observable是ObservableMap对象,操作流程如下:

        3.1、subscribe会调用ObservableMap的subscribeActual;该方法会在ObservableMap内部创建一个MapObserver(Function,Observer),传入原始Observer和Function函数;创建完MapObserver后会调用ObservableCreate.subscribe(MapObserver);

        3.2、ObservableCreate.subscribe(MapObserver)方法实际是调用父类Observable.subscribe(MapObserver)函数;

        3.3、调用Observable.subscribe(MapObserver)时,此时Observable对象实际是ObservableCreate,所以调用ObservableCreate.subscribeActual(MapObserver);

        3.4、ObservableCreate.subscribeActual会创建CreateEmitter(MapObserver),然后调用ObservableOnSubscribe.subscribe(CreateEmitter);

        3.5、最终调用到CreateEmitter.onNext(String),由于CreateEmitter已经传入了MapObserver,所以onNext会先调用Function.apply进行数据变换(这里也就是Integer.parseInt),得到变换后的数据后,在调用MapObserver中的原始Observer的onNext函数。自此,整个调用链结束。

上一篇:VirtualApk源码分析- service插件化


下一篇:VirtualApk源码分析-Activity插件化