RxJava create和flatMap的源码分析

首先看看RxJava最基本的用法:

create:

创建一个Observable对象,然后subscribe一个Observer对象,翻译过来就是一个被观察者对象订阅了一个观察者对象(其实应该反过来比较符合逻辑,但是这样才更符合链式调用)

代码看起来似乎无从下手,可以将它转换成这样:

设置转成这样:

在这里插入图片描述

这样好分析多了。。。

通过Observable的create方法生成一个Observable对象,然后调用这个对象的subscribe方法并传入一个ObservableOnSubscribe对象。

先从Observable的create方法开始:

在这里插入图片描述

在这里插入图片描述

可以发现f为空值时,直接就返回ObservableCreate对象,并将stringObservableOnSubscribe作为它的一个属性source
在这里插入图片描述

所以observable对象即为ObservableCreate,Observable是一个抽象类

接着调用它的subscribe方法,因为ObservableCreate没有subscribe方法,只能找它的父类Observable了:

在这里插入图片描述

可以看到先判断是否非空,然后调用subscribeActual方法并传入observer对象(即为自定义实现接口的对象),ObservableCreate重写了这个方法,所以看看它的实现:

在这里插入图片描述

1、首先将observer传给一个CreateEmitter对象:

在这里插入图片描述

2、然后调用observer.onSubscribe(parent),所以就打印了onSubscribe:
在这里插入图片描述
这个Disposable对象即为CreateEmitter对象

3、继续执行

source.subscribe(parent);

source:即为传入的ObservableOnSubscribe对象stringObservableOnSubscribe

parent:CreateEmitter对象

ObservableOnSubscribe的subscribe实现即为自定义的实现:

在这里插入图片描述

执行了ObservableEmitter的onNext方法,即为CreateEmitter的方法:

在这里插入图片描述

初始时isDisposed为false,这是一个结束标志位,执行observer.onNext(t):即自定义Observable的onNext方法:

在这里插入图片描述

所以打印onNext,一个事件结束!

执行接下来的发射事件都是一样的,最后执行onComplele方法:

在这里插入图片描述

执行onComplete方法,并调用dispose将isDisposed置为true,之后便再也无法通过onNext发射事件了。

所以整个事件的调用链即为:

Observable.subscribe
->ObservableCreate.subscribeActual
->Observer.onSubscribe
->ObservableOnSubscribe.subscribe
->CreateEmitter.onNext->
Observer.onNext

flatMap:

在这里插入图片描述

同样的复杂,转换成简单些的调用方式:

在这里插入图片描述
可以发现这段代码涉及2个observable。

observable1与之前相同,是一个ObservableCreate对象,然后调用它的flatMap方法:

在这里插入图片描述

可以发现返回一个ObservableFlatMap对象,所以observable2即为ObservableFlatMap对象

调用observable2的subscribe方法,同样的ObservableFlatMap没有这个这个方法,所以同样的回到父类Observable:

在这里插入图片描述

和之前一样调用subscribeActual方法,与之前不同的是,这个subscribeActual方法是ObservableFlatMap的方法:

在这里插入图片描述

这里调用了source.subscribe:

source不在ObservableFlatMap中,而是在父类AbstractObservableWithUpstream:

在这里插入图片描述

可以看出是由构造方法传入的,而ObservableFlatMap的构造方法:

在这里插入图片描述

由第一个参数传入并赋值给父类,回到之前的flatMap方法:

在这里插入图片描述

可以看到这里传入的是this,flatMap方法是谁调用的?observable1调用的:

在这里插入图片描述

因此这个this即为observable1,然后调用它的subscribe方法:

同样的,它没有subscribe方法而是它的父类才有,它的父类又会调用subscribeActual方法,这和之前是一样的!

在这里插入图片描述

传入的observer是ObservableFlatMap调用subscribeActual传入的MergeObserver对象

1、与之前相同,根据这个observer传入CreateEmitter构造方法并生成一个CreateEmitter对象

2、然后调用MergeObserver的onSubscribe方法:

在这里插入图片描述
调用

actual.onSubscribe(this);

即调用自定义的Observer对象的onSubscribe:

在这里插入图片描述

3、调用source的subscribe方法:

在这里插入图片描述

这个与之前相同,没啥好说的了

调用CreateEmitter的onNext方法:

在这里插入图片描述

这个observer即为传入的MergeObserver,调用它的onNext:
在这里插入图片描述

1、调用mapper的apply方法获得p(即ObservableSource对象)

即:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一开始传入的匿名接口实现对象Function类并实现它的apply方法,返回Observable.just(s)

在这里插入图片描述

即ObservableJust对象

2、因为maxConcurrency等于Integer.MAX_VALUE,所以if语句不执行,直接执行3:subscribeInner

在这里插入图片描述

p的父类实现了Callable接口,因此执行tryEmitScalar,执行后break(因为maxConcurrency == Integer.MAX_VALUE)

tryEmitScalar:

在这里插入图片描述

调用由ObservableJust实现的call方法获取u:

在这里插入图片描述

可以发现返回value,而value即为执行apply方法时原封传入的String值,获取u后调用

actual.onNext(u)

actual即为自定义实现的Observer接口对象:

在这里插入图片描述

return返回,后续的多个onNext发射即是这样。

代码调用链:

Observable.subscribe
->ObservableFlatMap.subscribeActual
->Observable.subscribe
->ObservableCreate.subscribe
->ObservableCreate.subscribeActual
->MergeObserver.onSubscribe
->observer.onSubscribe
->ObservableOnSubscribe.subscribe
->CreateEmitter.onNext
->MergeObserver.onNext
->Function.apply
->ObservableJust.call
->observer.onNext

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哒哒呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值