Rxjava工作原理总结

Rxjava整体工作原理

本质上是观察者模式:Observer(观察者)监听Observable(被观察者)。每个操作符实际上会创建一个Observable,其中配套会创建一个代理了下一级注册给它的Observer的Observer。在代码链的最后进行subsribe时,每一层的Observable会依次逆序(从最后一层到第一层)地把自己的Observer注册给上一级的Observable,直到第一层的Observable对注册给它的Observer进行回调。此时顺序(从第一层到最后一层)地回调下一层的Observer,直至最后一层,流水线就是这样实现的。

注意:

  1. 因为是链式传递,所以必须要有一个地方是终止这个关系,即主动对注册过来的上一级Observer进行回调,在Rxjava世界中可理解为生产数据,回调上一级的Observer进行处理、消费。
  2. 基于链式的代码链,每次创建的Observable会包含上一级的Observable。在代码链最后进行subscribe时,每一层的Observable依次subscribe上一级的Observable。由于上一级的Observable是在当前的Observable中进行subscribe,所以可以先进行一些别的操作(如切换线程)再去subscribe。
  3. 因为subscribe到上一级的Observer是一个代理,所以在上一级回调来的时候可以先进行一些操作(例如切换线程、filter、map)再回调给自己的下一级。就像流水线中每个车间都可以进行加工。
  4. 每一级的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()工作原理:

  1. Observable.create()会创建一个名为ObservableCreate的Observable,然后subscribe的时候调用ObservableCreate的subscirbeActual()方法,其中会创建一个实现Disposable接口的类CreateEmitter作为Observer,其代理了下一级subscribe过来的Observer。
  2. subscirbeActual()中把CreateEmitter subscribe给终点Observable,终点Observable调用CreateEmitter的onNext(),onCompleted()等方法。因为CreateEmitter是上一级Observer的代理类,所以可以代理onNext()等消息,例如可以检查是否中断分发给下一级Observer的消息。

Observable.subscribeOn()工作原理:

  1. Observable.subscribe()会创建一个名为ObservableSubscribeOn的Observable,然后subscribe的时候调用ObservableSubscribeOn的subscirbeActual()方法,其中会创建一个实现Disposable接口的类SubscribeOnObserver,其中代理了下一级subscribe过来的Observer。
  2. subscirbeActual()根据传递过来的Scheduler调度器进行线程操作,最后会在Scheduler指定的线程中subscribe上一级Observable,从而实现切换线程的效果。上一级Observable处理完数据后回调SubscribeOnObservser的onNext(),onCompleted()等方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值