RxJava 中 Subscription 与 Disposable 对比
基本概念
Subscription (RxJava 1.x)
- 所属版本: RxJava 1.x
- 作用: 表示订阅关系,用于取消订阅和检查订阅状态
- 主要方法:
unsubscribe(): 取消订阅isUnsubscribed(): 检查是否已取消订阅
Disposable (RxJava 2.x/3.x)
- 所属版本: RxJava 2.x 及更高版本
- 作用: 表示可释放/可丢弃的资源,用于取消订阅或释放资源
- 主要方法:
dispose(): 释放资源/取消订阅isDisposed(): 检查是否已释放
详细对比
| 特性 | Subscription (RxJava 1.x) | Disposable (RxJava 2.x/3.x) |
|---|---|---|
| 所属版本 | RxJava 1.x | RxJava 2.x/3.x |
| 接口设计 | 专门用于订阅管理 | 更通用的资源管理接口 |
| 取消方法 | unsubscribe() | dispose() |
| 状态检查 | isUnsubscribed() | isDisposed() |
| 组合能力 | 通过 CompositeSubscription | 通过 CompositeDisposable |
| 与Observer关系 | Observer不直接返回 | Observer直接返回Disposable |
演进关系
RxJava 2.x 用 Disposable 取代了 Subscription,主要原因是:
- 避免与 Reactive Streams 中的
org.reactivestreams.Subscription命名冲突 - 将概念从"订阅"扩展为更通用的"资源管理"
- 使接口设计更加一致和清晰
使用示例
RxJava 1.x Subscription 示例
Subscription subscription = Observable.just(1, 2, 3)
.subscribe(System.out::println);
// 检查状态
if (!subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
RxJava 2.x Disposable 示例
Disposable disposable = Flowable.range(1, 10)
.subscribe(System.out::println);
// 检查状态
if (!disposable.isDisposed()) {
disposable.dispose();
}
组合管理示例 (RxJava 2.x)
CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable d1 = Observable.just(1).subscribe();
Disposable d2 = Observable.just(2).subscribe();
compositeDisposable.addAll(d1, d2);
// 一次性取消所有
compositeDisposable.dispose();
最佳实践
- 及时释放资源:对于可能长时间运行或持有资源的Observable/Flowable,应妥善管理Disposable
- 避免内存泄漏:在Android等环境中,应在生命周期结束时(如Activity的onDestroy)调用dispose()
- 使用CompositeDisposable:管理多个Disposable,便于统一释放
- 检查状态:在执行dispose()前检查isDisposed()可避免重复操作
注意事项
- RxJava 2.x/3.x中虽然还有
Subscription接口,但它属于org.reactivestreams包,用于Flowable的背压控制 - Disposable的设计更加通用,不仅可以表示订阅关系,还可以表示任何需要释放的资源
- 从RxJava 1.x迁移到2.x时,需要将Subscription相关代码改为Disposable
1125

被折叠的 条评论
为什么被折叠?



