RxJava2链式调用操作符源码分析之map操作符

一、概述

  在上一节中我们分析了一个最简单的从观察者被观察者的创建、数据的发送到接收的流程。本节会着重分析一下Map操作符的原理以及源代码级别的具体实现。

二、最简单的RxJava,从创建观察者、绑定观察者、发射数据到接收过程回顾(温故而知新,如果觉得不够清晰可以先看上一节的代码分析)

  1.创建观察者:调用Observable.create(ObservableOnSubscribe source)创建一个叫做ObservableCreate的被观察者,其持有ObservableOnSubscribe的实例。

  2.创建被观察者:调用Observable.subscribe(Consumer consumer)发起订阅。会调用subscribe方法来创建一个LambdaObserver观察者对象,这个就是真正的观察者对象。然后调用ObservableCreate的subscribeActual方法实现观察者和被观察者真正的绑定。在subscribeActual方法中首先会创建一个CreateEmitter发射器,其实现了ObservableEmitter接口。CreateEmitter持有Observer对象。并调用Observable.subscribe来实现回调函数的调用,即设置ObservableOnSubscribe实例。

  3.从数据的发送到接收:由于ObservableEmitter是一个接口真正的实现是CreateEmitter,所以调用emitter.onNext方法会间接调用LambdaObserver的onNext方法,而LambdaObser持有Consumer接口实例,所以LambdaObserver又会间接的调用Consumer接口实例的accept方法。最终完成数据的接收。

三、map操作符分析

  Map操作符在RxJava中的作用一般是做数据转换的(映射),例如:把给原始对象加内容加包装,把原始数据做类型转换。如:String转Integer。Object转String等等。

  下面看下最简单的例子,根据这个例子结合上一节的创建、绑定、发射、接收流程来分析map操作符的执行流程。

private void currentThreadRxJavaMapTest() {
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("《深入Java虚拟机》");
            }
        });
        observable.map(new Function<String, Object>() {
            @Override
            public Object apply(String s) throws Exception {
                return s + "这本书很有深度。";
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                Log.e(TAG, o.toString());
            }
        });
    }

  以上输出的最终结果是:“《深入Java虚拟机》这本书很有深度”,如果把Map操作符去掉,则直接输出“《深入Java虚拟机》”。使用方法非常简单,不多介绍,本节重点分析其实现原理

  Map的原理和上一节分析的基本上一致的只是操作符把ObservableCreate加了一层装饰,此处用到的是装饰模式。下面具体分析一下。

  Observable.create仍然创建的是一个ObservableCreate对象。

 Observable.map(Funcation fun)其实是创建了一个ObservableMap对象

 ObservableMap对象持有两个参数一个是this,代表上面创建的ObservableCreate对象。一个是mapper代表的是map参数中传递的Function接口实例。从而让ObservableMap同时持有ObservableCreate和Function的实例

 到此处为止,被观察者对象已经从ObservableCreate转换为了ObservableMap对象。

仍然执行ObservableMap对象的subscribe方法调用的其实是ObservableMap对象的subscribe,而subscribe又会调用ObservableMap的subscribeActual方法。在ObservableMap对象的subscribeActual方法中会生成一个新的MapObserver对象,且此对象持有LambdaObserver实例和Function实例。如下代码所示

 经过以上代码,观察者就转换成了MapObserver对象,并完成了最终的绑定。

所以从发射数据到转换数据再到接收数据的流程为:ObservableEmitter.onNext方法会调用ObservableMap.onNext方法。ObservableMap.onNext方法通过Function的apply完成方法的转换。

 转换完成后会调用actual方法的onNext方法(ps:此处的actual其实就是被观察者LambdaObserver)。actual.onNext方法又会调用Consumer.accept方法。从而完成最终的数据发射到接收的过程。 

五、相信经过以上的分析,读者再使用到map操作符的时候就能有一个更深入的理解了。可以做到知其然,且知其所以然。

猜你喜欢

转载自www.cnblogs.com/tony-yang-flutter/p/12326408.html