RxJava之defer操作符

时间:2021-09-07 14:19:36

Defer操作符

1. 作用

defer 操作符与create、just、from等操作符一样,是创建类操作符,不过所有与该操作符相关的数据都是在订阅是才生效的。

2. 用法:

    i = 12;
    //注意此处defer的参数是Func0,而不是OnSubscrie
    Observable observable = Observable.defer(new Func0<Observable<Integer>>(){
        @Override
        //注意此处的call方法没有Subscriber参数
        public Observable<Integer> call(){
            return new Observable.from(i);
        }
    });

    i = 15;

    observable.subscribe(new Action1<Integer>(){
        @Override
        public void call(Integer i){
            System.out.println("integer = [" + integer + "]");
        }
    })

这段代码的输出为: integer = [15]

3. 事件流分析

相关类:OnSubscribeDefer,其具体流程如下:
1. 产生Observable对象;注意此处defer的参数是Func0,调用defer之后,继续讲Func0当做参数创建ObSubscribeDefer实例。

    Observable.defer(new Func0<Observable<Integer>>(){
        @Override
        //注意此处的call方法没有Subscriber参数
        public Observable<Integer> call(){
            return new Observable.from(i);
        }
    });

2.订阅 ;当产生订阅关系时,将会调用1中的OnSubscribeDefer实例的call方法,再call方法中调用func0的call方法,所以所有该Observable所用到的数据都是在离调用subscribe最近的地方的数值。

    observable.subscribe(new Action1<Integer>(){
        public void call(Subscriber subscriber){
            //do Something
        }
    }

总结:defer操作符相对简单,将Func1的实例当做参数去构建OnSubscribeDefer对象,在发生订阅关系时,再去回调func1.call();

思考

不管使用基本的create还是just、from或defer,在OnSubscribe(或Observer、Subscriber)的call方法结束完毕(或者future得到callable的数据之后),是如何唤起Observer的call方法、complete方法甚至onError方法的呢?

  1. create操作在call方法结束之后,需要手动调用subscriber.next()或subscriber.complete()方法。
  2. just,from或defer都是在producer中调用的onComplete、onNext、onError方法。
  3. future,首先ObSubscribeToObservableFuture.call方法,在该方法中,当future取到callable的返回值后,将回调onNext、onComplete、OnError方法。