RxJava之map源码解析

最近由于比较忙,同时需要分享RxJava的内容,所有看了好久的RxJava的源码,今天我们主要讲的是RxJava之map的源码的分享。
首先我们还是老规矩,先上一个demo

这里写图片描述

在这个demo中,我们只是简单的把字符串的12345转换成了Integer的12345,这只是一个简单的demo,但是要了解他真正的转换的过程,其实是一件不容易的事情。
下面我们来仔细的分享下他具体的实现的原理。

1:Observable.create(),在这个方法中,我们创建了一个Observable1,OnSubscribe1;
这里我们暂且这么叫,因为当链式调用太多方法的时候,创建的对象会很多,不太好形容。

2:map的时候,我们又创建了一个Observable2和OnSubscribe2,在这里也只是保存了对其的引用。同时会创建一个OperatorMap,这个类中会保存对map函数的引用。名为transformer。

3:当调用subscribe的时候,可以看到,创建了一个Subscriber,我们这里也先叫他subscriber1,我们进去subscribe源码方法中看一下,他到底做了什么:如下图

这里写图片描述

我们仔细看下红色框出来的地方,有人可能会不明白,这个红色的地方的OnSubScribe是我们前面创建的哪个OnSubcribe,我以前也很迷惑,看下传入的参数,一个是Subscriber,一个是Observable,,这个Subscriber是我们刚才new出来的那个,Observable是我们在调用map的时候生成的Observable2,所以这个call方法执行的是下面的方法:
这里写图片描述

看下这个lift方法,首先会调用hook.onLift(operator).call(o);这个方法又创建了一个Subscriber,为什么呢,我们同样也看一下源码,这个源码是在OperatorMap里面的call方法的源码,并且传入的Subscriber1.
返回的又是一个新的Subscriber,我们暂且叫他为Subscriber2:

这里写图片描述

接下来执行了lift方法中的Onsubscribe.call(st),这个方法的入参是Subscriber2,可能有些人会迷惑,这个Onsubscribe又是哪个呢,其实在调用map的时候,我们是通过Observable1去调用的,所以这里的OnSubscribe是Onsubscribe1,也就是调用了我们create方法中写的call方法,同时传入的参数是subscriber2,完成了从下往上的调用。

接下来我们来分析当执行create方法里面的call方法的时候,具体做了什么工作。

1:因为我们传入的subscriber是subscriber2,大家仔细想一下,这个是哪个呢,通过分析我们可以看到我们调用的subcriber是OperatorMap中的subscriber,这个图片我们已经在上面贴出来过,所以我在这边就不再贴了。
2:在OperatorMap中的subscriber的onNext的方法中,我们首先通过刚才保存的transformer引用调用了map方法中转换函数,通过转换之后,再来调用subscriber1中的onNext方法,也就是我们自己写的onNext方法,至此,我们的整个流程就结束了。

那么下面我们来画一张简单的流程图,理一下具体的实现的逻辑,
这里写图片描述

这张图很好的表现了方法的具体的执行的过程,大家可以理解一下。

可能有人会问,onComplete方法是在哪里调用的呢,那么接下来我们看下剩余两个方法调用的位置。
还是上图:

这里写图片描述
我们很快的可以看到onError的执行的时机,就是方法出错的时候,onComplete方法,我们再来找一下,
if (!(subscriber instanceof SafeSubscriber)) {
// assign to
observerso we return the protected version
subscriber = new SafeSubscriber<T>(subscriber);
}

我们创建了一个SafeSubscriber,他继承自Subscriber,里面有一个onCompete方法,这里面的方法就是我们执行的onCompete方法。

讲到这里,我们就把map的源码分析完了,谢谢大家的到来,有什么建议,请在下面留言,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值