一、冷数据流(Cold Observable)
1、基本介绍
-
订阅时才开始产生数据。每个订阅者都收到独立且完整的数据序列
-
常见场景:数据库查询、网络请求、文件读取
-
类比:点播视频。每次播放都从头开始
-
Retrofit 的网络请求被适配成 Observable 后,它就是一个标准的冷数据流
-
在 RxJava 的实际开发中,90% 以上接触到的都是冷数据流,因为冷数据流的思维模型更符合我们日常编写代码的习惯,调用函数,返回结果
2、演示
java
Observable<Long> coldObservable = Observable.interval(1, TimeUnit.SECONDS);
coldObservable.subscribe(
value -> System.out.println("订阅者1 收到: " + value),
Throwable::printStackTrace,
() -> System.out.println("订阅者1 完成")
);
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
coldObservable.subscribe(
value -> System.out.println("订阅者2 收到: " + value),
Throwable::printStackTrace,
() -> System.out.println("订阅者2 完成")
);
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
-
输出结果
订阅者1 收到: 0
订阅者1 收到: 1
订阅者1 收到: 2
订阅者1 收到: 3
订阅者2 收到: 0
订阅者1 收到: 4
订阅者2 收到: 1
订阅者1 收到: 5
订阅者2 收到: 2
二、热数据流(Hot Observable)
1、基本介绍
-
创建时就开始产生数据,无论有无订阅。所有订阅者收到的是同一份数据流,可能不完整
-
常见场景:鼠标点击事件、股票行情推送、传感器数据
-
类比:现场直播。订阅时,节目已经播到哪就听到哪
2、演示
java
Observable<Long> coldObservable = Observable.interval(1, TimeUnit.SECONDS);
ConnectableObservable<Long> hotObservable = coldObservable.publish();
hotObservable.connect();
hotObservable.subscribe(
value -> System.out.println("订阅者1 收到: " + value),
Throwable::printStackTrace,
() -> System.out.println("订阅者1 完成")
);
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
hotObservable.subscribe(
value -> System.out.println("订阅者2 收到: " + value),
Throwable::printStackTrace,
() -> System.out.println("订阅者2 完成")
);
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
-
输出结果
订阅者1 收到: 0
订阅者1 收到: 1
订阅者1 收到: 2
订阅者1 收到: 3
订阅者2 收到: 3
订阅者1 收到: 4
订阅者2 收到: 4
订阅者1 收到: 5
订阅者2 收到: 5