RxJava
RxJava 的依赖
reactive-streams 是rxjava2的唯一依赖,rxjava用到了这个库的4个关键类
- publisher
- processor
- subscriber
- subscription
其中最为主要的就是 publisher, subscriber, subscribption。
processor在事件总线中会用到,我们以后讨论。
主要流程就是 Publisher 执行 subscribe 方法,调用 Subscriber,然后 subscriber调用 onSubscribe方法,调用 subscription, subscription调用 request方法以后,我们的RxJava就开始跑了,当然实际上还要复杂一点。
一个简单例子
Flowable.just(1)
.filter(integer -> integer >= 1)
.map(integer -> integer * integer)
.subscribe(integer -> {
System.out.println(integer);
});
我们会顺序构造 FlowableJust, FlowableFilter, FlowableMap, 然后我们会得到一个Flowable,
Flowable flowable = Flowable.just(1)
.filter(integer -> integer >= 1)
.map(integer -> integer * integer);
然后我们执行一次subscribe
flowable.subscribe(integer -> {
System.out.println(integer);
});
追溯Flowable的subscribe方法
我们会发现类似于 publisher的 subscribe方法,consumer会被包装成为一个subscriber(在我们的例子里就是一个LambdaSubscriber),只不过,这里的subscribe方法,其实真正执行的是Flowable的subscribeActual方法
而subscribeActual是抽象方法,真正执行的时候,比如FlowableMap中
执行的是source.subscribe,这里的source就是上游,比如我们例子中的flowableMap,它的上游就是flowableFilter。Flowable已经实现了subscribe方法并且该方法用final修饰,所以它无法被子类复写,我们会发现flowable的subscribe方法会产生一个递归,flowableMap先调用 subscribe,然后发生flowableFilter.subscribe,直到递归到flowableJust的时候
开始执行onSubcribe, 这里subscribe递归彻底结束,开始回溯。FlowableJust会先调用FilterSubscribe的onSubscribe方法,其实就是 BasicFuseableSubscriber 的 onSubscribe方法,顺带着给this.s 赋值,这个this.s其实是一个Subscription,表示当前flowable的上游。
这里actual是下游的subscriber,所以会一直执行onSubscribe方法直到最终会跑到我们的那个包装consumer的Subscriber,也就是LambdaSubscriber,在LambdaSubscriber里面
accept方法会最终执行。观察Flowable的subscribe(Consumer c)方法
FlowableInternalHelper.RequestMax.INSTANCE本质上就是一个consumer,它最终子LambdaSubscriber的onSubscriber里面执行了accept方法
接下来,就是开始request了,执行request类似于subscribe,会反复递归调用,
因为执行request方法的是subscription,刚才在BasicFuseableSubscriber类里面,this.s就是一个subscription并且在onSubscribe方法里被赋值。request反复递归调用最终会跑到ScalarSubscription, 在这里,request方法里,开始执行onNext,
接下来的事情就简单了,无非就是一个subscriber执行onNext,传递数据到下一个onNext,依次执行。FlowableFilter里面特殊一点,会执行tryOnNext方法
在没有线程切换的情况下,我们可以看一下RxJava2调用的栈帧,大体流程就是先subscribe 再执行onSubscribe 再执行 request,然后就会真正从头开始处理数据了。这也就是文章最开始提到的reactive-streams的基本数据处理架构。