RxJava之defer操作符

https://blog.csdn.net/zhuxuliao/article/details/51542809

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 + "]");
        }
    })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这段代码的输出为: 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);
        }
    });
1
2
3
4
5
6
7
2.订阅 ;当产生订阅关系时,将会调用1中的OnSubscribeDefer实例的call方法,再call方法中调用func0的call方法,所以所有该Observable所用到的数据都是在离调用subscribe最近的地方的数值。

    observable.subscribe(new Action1<Integer>(){
        public void call(Subscriber subscriber){
            //do Something
        }
    }
1
2
3
4
5
总结:defer操作符相对简单,将Func1的实例当做参数去构建OnSubscribeDefer对象,在发生订阅关系时,再去回调func1.call();
思考
不管使用基本的create还是just、from或defer,在OnSubscribe(或Observer、Subscriber)的call方法结束完毕(或者future得到callable的数据之后),是如何唤起Observer的call方法、complete方法甚至onError方法的呢?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值