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操作符的执行流程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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操作符的时候就能有一个更深入的理解了。可以做到知其然,且知其所以然。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2014-02-18 Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml