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

相关推荐
今天要早睡_15 小时前
C++入门到精通:类和对象(下)全方位解析
android·c++
许彰午15 小时前
53-审计三表
java·低代码·架构
重生之小比特15 小时前
【C++进阶】红黑树的实现
java·开发语言·c++
程序猿乐锅15 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
FYKJ_201017 小时前
springboot助农产品销售商城05829-计算机课程设计、毕业设计
java·spring boot·python·mysql·spark·django
user_admin_god19 小时前
第 10 篇:拼上下文与生成——预算、边界与防幻觉
java·人工智能·spring boot·语言模型
用户31268748772019 小时前
GC 算法与垃圾收集器演进:从 Serial 到 ZGC
java
Godikov19 小时前
在 Android 上跑 Kafka Consumer:一个实时定位数据接入的踩坑记录
android
天天被压力20 小时前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #02】涨停跌停与特色股池:5类股池接口一次拉全
java·人工智能·python
mmsx20 小时前
Android 自定义 View 三关:触摸分发、绘制与坐标错位
android·kotlin