RxJava - 冷数据流与热数据流

一、冷数据流(Cold Observable)

1、基本介绍
  1. 订阅时才开始产生数据。每个订阅者都收到独立且完整的数据序列

  2. 常见场景:数据库查询、网络请求、文件读取

  3. 类比:点播视频。每次播放都从头开始

  4. Retrofit 的网络请求被适配成 Observable 后,它就是一个标准的冷数据流

  5. 在 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、基本介绍
  1. 创建时就开始产生数据,无论有无订阅。所有订阅者收到的是同一份数据流,可能不完整

  2. 常见场景:鼠标点击事件、股票行情推送、传感器数据

  3. 类比:现场直播。订阅时,节目已经播到哪就听到哪

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

相关推荐
CoderYanger4 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE7 小时前
11.7[高体】
java·后端·spring
apcipot_rain8 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A8 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白10 小时前
LangGraph4j 实战(下)
java
天诰10 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
好的佩奇14 小时前
Dart 之扩展方法
android·flutter·dart
这个昵称不容易14 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长14 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
三少爷的鞋15 小时前
换个思路理解:非阻塞挂起
android