温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

RxJava如何取消订阅

发布时间:2026-09-01 14:12:25 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

RxJava 中,“取消订阅”本质上就是 切断 Observable 和 Observer 之间的订阅关系,不再接收事件。常见方式如下(以 RxJava2 / RxJava3 为主):


一、使用 Disposable(最常用 ✅)

1️⃣ 订阅时拿到 Disposable

Disposable disposable = Observable.just(1, 2, 3)
        .subscribe(
                value -> Log.d("Rx", "onNext: " + value),
                error -> Log.e("Rx", "onError", error),
                () -> Log.d("Rx", "onComplete")
        );

2️⃣ 取消订阅

disposable.dispose();

3️⃣ 判断是否已取消

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 取消

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 会在新事件到来时 自动取消上一个订阅


五、在 RxBinding / UI 场景中(Android)

通常结合 AutoDisposeLifecycle

Observable.timer(3, TimeUnit.SECONDS)
    .as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this)))
    .subscribe();

六、总结 ✅

场景 推荐方式
单个订阅 Disposable.dispose()
多个订阅 CompositeDisposable
条件停止 takeUntil / takeWhile
UI 生命周期 AutoDispose / Lifecycle
防重复请求 switchMap

如果你愿意,可以告诉我你是 RxJava2 还是 3Android 还是后端,我可以给你更具体的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI