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