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

相关推荐
hai_android13 分钟前
把 Android App 打包成系统应用(System App)
android·kotlin·android jetpack
JMchen35 分钟前
【Jetpack 内核实战 01】开篇:Jetpack 组件全家桶核心逻辑与专栏完整规划
android·kotlin·android jetpack
Bazingga1 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff2 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3272 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar3 小时前
Java封装、继承、多态
java·开发语言
ly76893 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠3 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
hunterandroid3 小时前
Retrofit 网络请求的异常处理与重试策略实战
android
sejinan3 小时前
极致轻量与秒级起播:NativeWasmTv 开源硬核技术解析与升级版体验
android·开源·webview·tv