自从看了仍物线写的<<给 Android 开发者的 RxJava 详解>>,觉得rxJava还是挺有意思的。它的主要两个功能是数据转换和线程切换,如果掌握好的话能给工作开发带来很大的效率提高(虽然我还没掌握好?)。既然是这么好的一个框架,而且还受到广大android开发者的一致好评,那么就有必要去看看它到底是一个什么东西,功能是怎么实现的。
本篇从源码的角度浅显的解释下发布者、订阅者和订阅过程中的数据流向。
先上一个简单的demo,如下:
/**
*订阅后,数据源一个一个的经过各个transformer传给订阅者
*/
Flowable.range(1, 5)
.map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer v) throws Throwable {
return v * v;
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Throwable {
System.out.print(integer + ",");
}
});
函数的功能就是计算1-5的各个数的平方,运行结果:1,4,9,16,25,
下面进入源码看看依次生成的几个关键类:
public static Flowable<Integer> range(int start, int count) {
...//省略无关代码
return RxJavaPlugins.onAssembly(new FlowableRange(start, count));
}
public final <R> Flowable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new FlowableMap<T, R>(this, mapper));
}
可以看到方法rang和map分别生成了FlowableRange和FlowableMap,RxJavaPlugins.onAssembly的作用一般就是返回传给它的参数,所以就是返回了FlowableRange和FlowableMap。其实FlowableRange和FlowableMap就是发布者。
所有的发布者都是Flowable的子类,细心观察的话可以发现,FlowableRange作为初始的发布者,它存储了原始的数据;FlowableMap接收了个this参数,this实际就是他的上级Flowable(这里指FlowableRange),也就是说下一级发布者引用了它的上一级发布者。
发布者有很多类型,比如Flowable、Observable、Single、Completable、Maybe。发布者有一个通用final订阅方法,比如Flowable的是subscribe方法,意义就是所有的发布者订阅订阅者用的都是这个方法。
订阅者是谁呢?当发布者调用subscribe方法的时候,订阅者就产生了。subscribe方法的参数就是订阅者,就是上面的Consumer对象,Consumer的accept方法就是它对消息的消费行为。
数据是如何从发布者流向到订阅者的呢,深入到订阅方法内部看看,接下来就是展现真的技术的时候了。
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
Action onComplete) {
...滤去无关代码
LambdaSubscriber<T> ls = new LambdaSubscriber<T>(onNext, onError, onComplete, FlowableInternalHelper.RequestMax.INSTANCE);
subscribeActual(ls);
return ls;
}
哈哈,其实也就这样啦。通过查看源码发现,最初的订阅产生了一个封装的LambdaSubscriber,然后通过subscribeActual依次向上传递的时候LambdaSubscriber会经过一次又一次的封装,如本例demo的MapSubscriber、RangeSubscription,而且它们还有一个上下引用的关系,它们三者的关系如图:
当RangeSubscription产生的时候订阅关系就生成了。订阅的时候flowable通过调用中间的flowable的subscribeActual依次生成中间的Subscriber和最终的Subscription;Subscription调用Subscriber的onSubscribe方法依次往下传递;最开始的Subscriber调用onSubscribe的时候反过来又去调用upstream的request方法,直到Subscription;然后Subscription开始发送数据,通过downstream的onNext方法依次吧数据从源端发送,最终数据流向到到最开始的订阅者。4个主要的方法调用方向如图:
最后,给出一个经过整合后的类关系图
相关的UML图如下
本文文笔不好,可能写的不是很明白,看不懂没关系,看源码就行了。写本片的目的主要就是记录下曾经学习rxjava做下的一些笔记。
最后是扔物线的博客 给 Android 开发者的 RxJava 详解。