RxJava操作符实践:1_创建操作之2_defer

一、描述

Defer操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。

在某些情况下,等待直到最后一分钟(就是知道订阅发生时)才生成Observable可以确保Observable包含最新的数据。

RxJava将这个操作符实现为 defer 方法。这个操作符接受一个你选择的Observable工厂函数作为单个参数。这个函数没有参数,返回一个Observable。

defer方法默认不在任何特定的调度器上执行。

二、示意图

defer

三、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
number = 1;
Observable justObservable = Observable.just(number);

number = 2;
Observable deferObservable = Observable.defer(new Func0<Observable<Integer>>() {
@Override
public Observable<Integer> call() {
return Observable.just(number);
}
});

number = 3;

justObservable.subscribe(new Action1() {
@Override
public void call(Object o) {
System.out.println("just result: " + o.toString());
}
});

deferObservable.subscribe(new Action1() {
@Override
public void call(Object o) {
System.out.println("defer1 result: " + o.toString());
}
});

number = 4;

deferObservable.subscribe(new Action1() {
@Override
public void call(Object o) {
System.out.println("defer2 result: " + o.toString());
}
});

四、运行结果

1
2
3
just result: 1
defer1 result: 3
defer2 result: 4

由运行结果可以看出:

just操作符是在创建Observable就进行了赋值操作,而defer是在订阅者订阅时才创建Observable,此时才进行真正的赋值操作,保证Observable的状态是最新的。

项目代码已上传到Github:https://github.com/SherlockShi/RxJavaBestPractise

五、参考资料

ReactiveX官方文档

ReactiveX文档中文翻译

PS:欢迎关注 SherlockShi 个人博客

感谢你的支持,让我继续努力分享有用的技术和知识点!