Rxjava整体工作原理
本质上是观察者模式:Observer(观察者)监听Observable(被观察者)。每个操作符实际上会创建一个Observable,其中配套会创建一个代理了下一级注册给它的Observer的Observer。在代码链的最后进行subsribe时,每一层的Observable会依次逆序(从最后一层到第一层)地把自己的Observer注册给上一级的Observable,直到第一层的Observable对注册给它的Observer进行回调。此时顺序(从第一层到最后一层)地回调下一层的Observer,直至最后一层,流水线就是这样实现的。
注意:
- 因为是链式传递,所以必须要有一个地方是终止这个关系,即主动对注册过来的上一级Observer进行回调,在Rxjava世界中可理解为生产数据,回调上一级的Observer进行处理、消费。
- 基于链式的代码链,每次创建的Observable会包含上一级的Observable。在代码链最后进行subscribe时,每一层的Observable依次subscribe上一级的Observable。由于上一级的Observable是在当前的Observable中进行subscribe,所以可以先进行一些别的操作(如切换线程)再去subscribe。
- 因为subscribe到上一级的Observer是一个代理,所以在上一级回调来的时候可以先进行一些操作(例如切换线程、filter、map)再回调给自己的下一级。就像流水线中每个车间都可以进行加工。
- 每一级的Observable能接收的数据类型由上一级决定。因为上一级的Observable实例化泛型参数,后面的Observable在subscribe时需要传递一个同泛型参数类型的Observer,所以实现了上一级把数据处理成什么类型,下一级就接收什么类型。
Observable分为终点Observable和中间Observable。中间Observable subscribe上一级Observable,处理上一级回调来的数据,并回调给下一级Observable。中间Observable既是观察者也是被观察者,如各个操作符创建的Observable。终点Observable只产生数据并回调给下一级。终点Observable只是被观察者。
操作符举例
操作符内部命名规则:Observable.XXX()则创建名为ObservableXXX的Observable,创建XXXObserver作为上一级Observer的代理类。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Log.d(TAG, "Observable subscribe() 所在线程为 :" + Thread.currentThread().getName());
emitter.onNext("文章1");
emitter.onNext("文章2");
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "Observer onSubscribe() 所在线程为 :" + Thread.currentThread().getName());
}
@Override
public void onNext(String s) {
Log.d(TAG, "Observer onNext() 所在线程为 :" + Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Observer onError() 所在线程为 :" + Thread.currentThread().getName());
}
@Override
public void onComplete() {
Log.d(TAG, "Observer onComplete() 所在线程为 :" + Thread.currentThread().getName());
}
});
Observable.create()工作原理:
- Observable.create()会创建一个名为ObservableCreate的Observable,然后subscribe的时候调用ObservableCreate的subscirbeActual()方法,其中会创建一个实现Disposable接口的类CreateEmitter作为Observer,其代理了下一级subscribe过来的Observer。
- subscirbeActual()中把CreateEmitter subscribe给终点Observable,终点Observable调用CreateEmitter的onNext(),onCompleted()等方法。因为CreateEmitter是上一级Observer的代理类,所以可以代理onNext()等消息,例如可以检查是否中断分发给下一级Observer的消息。
Observable.subscribeOn()工作原理:
- Observable.subscribe()会创建一个名为ObservableSubscribeOn的Observable,然后subscribe的时候调用ObservableSubscribeOn的subscirbeActual()方法,其中会创建一个实现Disposable接口的类SubscribeOnObserver,其中代理了下一级subscribe过来的Observer。
- subscirbeActual()根据传递过来的Scheduler调度器进行线程操作,最后会在Scheduler指定的线程中subscribe上一级Observable,从而实现切换线程的效果。上一级Observable处理完数据后回调SubscribeOnObservser的onNext(),onCompleted()等方法。