我们使用RxJava时会将业务逻辑抽象成一条函数链。实际上RxJava中的各种事件(包括subscribe、onNext、onError等)也是沿着这条链条传递的。
假设有这么一段抽象的RxJava代码:
O1
.operator1(...)
.operator2(...)
.subscribe(S1)
其中O1
是真正产生数据的Observable
,然后将两个操作符operator1
和operator2
作用到O1
上,最后用S1
进行订阅。一般而言操作符有两种实现方式:1.
实现OnSubscribe
;2.
通过lift
函数进行变换。这里假定操作符operator1
和operator2
都是通过函数lift
来实现。
表面看来这里只有一个Observable
和一个Subscriber
,但其实操作符会生成一些中间的Observable
和Subscriber
。下面这张图对此进行了阐释。
操作符对Observable
的封装是从上到下的,而对Subscriber
的封装正好相反。所以最后一句.subscribe(S1)
实际上是用S1
去subscribeO3
。
接下来就看一下subscribe事件是如何传递的。仍然用一张图进行说明:
subscribe事件是由下至上传递的。最后触发S3
subscribe O1
,进而引发数据产生。
在O1
的OnSubscribe
里调用subscriber.onNext
、subscriber.onError
以及subscriber.onCompleted
实际上都是调用S3
对应的回调。然后S3
在接收到数据后会进行相关处理,这取决于operator1
的功能;数据处理完后再传递给S2
,S2
对数据处理完后传给S1
。示意图如下:
因此数据的传递是从上至下的。
理解了RxJava中的事件传递链,再去看RxJava相关的代码就会容易很多了。