如何理解RxJava中的Observable.defer

什么是Observable?

Observable是一个对象,代表着被观察的数据方, 数据发布者,数据产生者,它会产生数据供消费者消费。
通过这边文章可以简单理解之:
https://blog.csdn.net/coobee/article/details/105817994

什么是Defer

Defer是延迟的意思。

Observable.defer是通过延迟创建数据生产者(Observable)的方式推迟数据生产的时间。
直到注册的时候才开始生产数据.

通过如下代码来测试一下使用了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
import rx.Observable;

public class Test {

    private static String dataProducer() {
        String str = "Hello,RxJava!";
        System.out.println("Produce Data :" + str);
        return str;
    }

    private static void just() {
        Observable.just(dataProducer()).doOnSubscribe(()->{
            System.out.println("Subscribe!");
        }).subscribe(s->{
            System.out.println("Consume Data :" + s);
        });
    }
    private static void defer() {
        Observable.defer(()->{
            return Observable.just(dataProducer());
        }).doOnSubscribe(()->{
            System.out.println("Subscribe!");
        }).subscribe(s->{
            System.out.println("Consume Data :" + s);
        });
    }

    public static void main(String [] args) {
        just();
        defer();
    }
}

可以看出,正常情况是先产生数据,再注册,再消费。

1
2
3
Produce Data :Hello,RxJava!
Subscribe!
Consume Data :Hello,RxJava!

而使用了defer之后,是先注册,再生产数据,再消费。

1
2
3
Subscribe!
Produce Data :Hello,RxJava!
Consume Data :Hello,RxJava!

参考资料

http://reactivex.io/documentation/operators/defer.html