首先看看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