背景
- 在Rxjava介绍和原理分析中简单介绍了Rxjava的实现及部分原理,今天来点进阶的内容,方便更好的理解Rxjava的实现原理。
- 主要介绍下Rxjava的观察者模式怎么实现、操作符的实现。
- 这里讲解的代码还是1.x的代码,主要看原理实现。
关于观察者模式
- 这里举一个例子,台灯(观察者)和开关(被观察者)
|
|
我们需要搞清楚3个问题:
- 被观察者中的Observable.OnSubscribe是什么,有什么用?
- call(subscriber)方法中,subscriber哪里来的?
- 为什么只有在订阅之后,被观察者才会开始发送消息?
首先来看OnSubscribe的代码:
|
|
- 而在Observable观察者的类中,OnSubscribe是它唯一的属性,同时也是Observable构造函数中唯一必须传入的参数,也就是说,只要创建了Observable,那么内部也一定有一个OnSubscribe对象。
- 不过Observable对象时不能直接new的,需要通过create()、just()、form()方法来获取。这些方法本质上是去new了Observable对象。
|
|
- 创建完对象,当进行订阅时,代码逻辑如下:
|
|
从代码中我们可以回答上面提出的三个问题:
- onSubscribe是Observable内部唯一属性,是连接Observable和subscriber的关键,相当于连接台灯和开关的那根电线
- call(Subscriber<? super String> subscriber)中的subscriber,就是我们自己创建的那个观察者
- 有在订阅的时候,才会发生onSubscribe.call(subscriber),进而才会开始调用onNext(),onComplete()等。
我们用一张图来表达上面的流程:
通过图中的流程,我们也可以做一个总结:
- 订阅这个动作,实际上是观察者(subscriber)对象把自己传递给被观察者(observable)内部的onSubscribe。
- onSubscribe的工作就是调用call(subscriber)来通知被观察者发送消息给这个subscriber。
关于操作符
- 我们直接以map为例来研究下操作符的工作流程,先看个例子:
|
|
- 我们看下map的代码:
|
|
- 上面代码是首先创建了一个Observable的代理对象。再看OnSubscribeMap的代码:
|
|
上面代码量比较大,在代码中也加入了关键的注释。我们下面用一张图来描述这个流程:
总结来说就是:每一个操作符,都会创建一个代理观察者和一个代理被观察者。类似于java动态代理,对执行过程中的对象做处理。