Subject vs Flowable vs Observable 对比

Subject vs Flowable vs Observable 对比

基本概念

Observable

  • 热/冷特性:默认是冷的(每个订阅者都会触发独立的数据流)
  • 背压处理:不支持背压(无法处理生产者速度大于消费者速度的情况)
  • 适用场景:数据量不大,不需要背压控制的场景

Flowable

  • 热/冷特性:默认是冷的
  • 背压处理:支持背压(可以处理生产者速度大于消费者速度的情况)
  • 适用场景:大数据量或不确定数据量的场景,需要背压控制

Subject

  • 热/冷特性:热的(数据发射与订阅无关)
  • 背压处理:取决于具体实现(如 PublishSubject 不支持背压,FlowableProcessor 支持)
  • 适用场景:需要将非响应式代码桥接到响应式世界,或多播场景

详细对比

特性ObservableFlowableSubject
背压支持不支持支持取决于实现
内存效率低(无背压控制)中等
初始开销较高(背压机制)
热/冷默认冷默认冷
多播能力需要 multicast()需要 multicast()内置多播
典型用例UI事件、小数据集网络请求、大数据集事件总线、桥接代码

使用建议

  1. 使用 Observable 当

    • 处理少量数据(<1000个元素)
    • 处理同步操作
    • 处理GUI事件(如点击)
  2. 使用 Flowable 当

    • 处理大量或可能无限的数据
    • 进行IO操作(如网络请求)
    • 需要背压控制
  3. 使用 Subject 当

    • 需要将传统回调转换为响应式流
    • 需要多播事件
    • 创建事件总线或类似模式

代码示例

// Observable 示例
Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onComplete();
});

// Flowable 示例(支持背压)
Flowable<Integer> flowable = Flowable.create(emitter -> {
    for (int i = 0; i < 10000; i++) {
        emitter.onNext(i);
    }
    emitter.onComplete();
}, BackpressureStrategy.BUFFER);

// Subject 示例(多播)
Subject<Integer> subject = PublishSubject.create();
subject.subscribe(System.out::println);
subject.subscribe(System.out::println);
subject.onNext(1);
subject.onNext(2);

性能考虑

  • Observable:轻量级,适合小规模数据,无背压开销
  • Flowable:有背压管理开销,但能防止内存溢出
  • Subject:性能取决于具体实现,通常用于桥接而非大数据处理

选择正确的类型取决于具体用例、数据量和背压需求。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值