在 RxJava 中,“取消订阅”本质上是切断上游和下游的联系,让上游不再往下发送数据,下游也不再接收。下面按常见场景给你梳理一下。
Disposablesubscribe() 返回 DisposableDisposable disposable = Observable.just(1, 2, 3)
.subscribe(
item -> Log.d("RX", "onNext: " + item),
Throwable::printStackTrace,
() -> Log.d("RX", "onComplete")
);
// 取消订阅
disposable.dispose();
✅ dispose() 之后:
CompositeDisposable适合 Activity / Fragment / ViewModel
CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable d1 = Observable.interval(1, TimeUnit.SECONDS)
.subscribe(aLong -> Log.d("RX", "tick"));
compositeDisposable.add(d1);
// 页面销毁时
compositeDisposable.clear(); // 保留容器
// 或
compositeDisposable.dispose(); // 容器也废了
✅ 推荐用法(Android):
@Override
protected void onDestroy() {
compositeDisposable.clear();
super.onDestroy();
}
bindToLifecycleObservable.interval(1, TimeUnit.SECONDS)
.compose(bindToLifecycle(this))
.subscribe(...);
Observable.timer(3, TimeUnit.SECONDS)
.compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
.subscribe(...);
takeUntilObservable.interval(1, TimeUnit.SECONDS)
.takeUntil(Observable.timer(5, TimeUnit.SECONDS))
.subscribe(...);
✅ 5 秒后自动取消订阅
Observer 内部取消Observable.range(1, 10)
.subscribe(new Observer<Integer>() {
private Disposable disposable;
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(Integer integer) {
if (integer == 5) {
disposable.dispose();
}
}
@Override public void onError(Throwable e) {}
@Override public void onComplete() {}
});
Flowable.range(1, 100)
.subscribe(new Subscriber<Integer>() {
private Subscription subscription;
@Override
public void onSubscribe(Subscription s) {
subscription = s;
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
if (integer == 3) {
subscription.cancel();
}
}
});
| 场景 | 方式 |
|---|---|
| 单个订阅 | Disposable.dispose() |
| 多个订阅 | CompositeDisposable |
| Android 生命周期 | bindToLifecycle |
| 条件停止 | takeUntil |
| Flowable | Subscription.cancel() |
如果你是用 RxJava2 / RxJava3 / Android / Kotlin,可以告诉我,我可以给你更具体的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。