在 RxJava 中,“取消订阅”本质上就是 切断 Observable 和 Observer 之间的订阅关系,不再接收事件。常见方式如下(以 RxJava2 / RxJava3 为主):
Disposable(最常用 ✅)DisposableDisposable disposable = Observable.just(1, 2, 3)
.subscribe(
value -> Log.d("Rx", "onNext: " + value),
error -> Log.e("Rx", "onError", error),
() -> Log.d("Rx", "onComplete")
);
disposable.dispose();
if (!disposable.isDisposed()) {
disposable.dispose();
}
CompositeDisposable(推荐在 Activity / Fragment 中使用 ✅)适合 统一管理多个订阅。
CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable d1 = Observable.interval(1, TimeUnit.SECONDS)
.subscribe(t -> Log.d("Rx", "tick"));
Disposable d2 = Observable.just(1, 2, 3).subscribe();
compositeDisposable.add(d1);
compositeDisposable.add(d2);
// 退出页面时统一取消
@Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.clear(); // 或 dispose()
}
clear() vs dispose()| 方法 | 区别 |
|---|---|
clear() |
清空但 CompositeDisposable 还能继续用 |
dispose() |
彻底废弃,不能再 add |
takeUntil / takeWhile(自动取消)Observable.interval(1, TimeUnit.SECONDS)
.takeUntil(v -> v == 5)
.subscribe(v -> Log.d("Rx", "v=" + v));
Observable.interval(1, TimeUnit.SECONDS)
.takeUntil(Observable.timer(5, TimeUnit.SECONDS))
.subscribe();
switchMap / flatMap 自动取消旧任务searchSubject
.debounce(300, TimeUnit.MILLISECONDS)
.switchMap(key -> api.search(key))
.subscribe();
switchMap 会在新事件到来时 自动取消上一个订阅。
通常结合 AutoDispose 或 Lifecycle:
Observable.timer(3, TimeUnit.SECONDS)
.as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this)))
.subscribe();
| 场景 | 推荐方式 |
|---|---|
| 单个订阅 | Disposable.dispose() |
| 多个订阅 | CompositeDisposable |
| 条件停止 | takeUntil / takeWhile |
| UI 生命周期 | AutoDispose / Lifecycle |
| 防重复请求 | switchMap |
如果你愿意,可以告诉我你是 RxJava2 还是 3、Android 还是后端,我可以给你更具体的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。