• 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操作符的时候就能有一个更深入的理解了。可以做到知其然,且知其所以然。

  • 相关阅读:
    dfs手写栈模板
    Remember the Word
    Sockets
    Sanatorium
    Exams
    Cormen — The Best Friend Of a Man
    win 7 普通家庭版 装IIS
    [引]构造文法时表达式中算符优先级的问题
    Chart系列(二):数据绑定
    算法整理篇之:数据结构 | 数组(1)
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/12326408.html
Copyright © 2020-2023  润新知