我们使用RxJava时会将业务逻辑抽象成一条函数链。实际上RxJava中的各种事件(包括subscribe、onNext、onError等)也是沿着这条链条传递的。

假设有这么一段抽象的RxJava代码:

O1
.operator1(...) 
.operator2(...) 
.subscribe(S1)

其中O1是真正产生数据的Observable,然后将两个操作符operator1operator2作用到O1上,最后用S1进行订阅。一般而言操作符有两种实现方式:1. 实现OnSubscribe;2. 通过lift函数进行变换。这里假定操作符operator1operator2都是通过函数lift来实现。

表面看来这里只有一个Observable和一个Subscriber,但其实操作符会生成一些中间的ObservableSubscriber。下面这张图对此进行了阐释。

操作符对Observable的封装是从上到下的,而对Subscriber的封装正好相反。所以最后一句.subscribe(S1)实际上是用S1去subscribeO3

接下来就看一下subscribe事件是如何传递的。仍然用一张图进行说明:

subscribe事件是由下至上传递的。最后触发S3 subscribe O1,进而引发数据产生。

O1OnSubscribe里调用subscriber.onNextsubscriber.onError以及subscriber.onCompleted实际上都是调用S3对应的回调。然后S3在接收到数据后会进行相关处理,这取决于operator1的功能;数据处理完后再传递给S2S2对数据处理完后传给S1。示意图如下:

因此数据的传递是从上至下的。

理解了RxJava中的事件传递链,再去看RxJava相关的代码就会容易很多了。