You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

取消DisposableSubscriber时onComplete不触发?如何感知订阅释放?

问题解答

1. 取消订阅时onComplete/onError不触发是否符合规范?

符合规范。RxJava中onComplete用于通知数据流正常完成所有发射,onError用于通知数据流因错误终止,而主动调用cancel()(或dispose())属于订阅者主动终止订阅,不属于这两种终止场景。这种设计是为了明确区分「数据流自然结束/出错」和「订阅者主动取消」两种不同的终止原因,避免逻辑混淆。

2. 如何获知订阅被释放的时机?

有两种常用方式:

  • 重写DisposableSubscriber的onDispose()方法:DisposableSubscriber提供了受保护的onDispose()方法,当调用cancel()触发订阅释放时,该方法会被执行,你可以在其中添加释放时机的处理逻辑:
    Disposable d =
        Flowable.range(1, 5)
                .subscribeWith(new DisposableSubscriber<Integer>() {
                    @Override
                    public void onStart() {
                        request(1);
                    }
    
                    @Override
                    public void onNext(Integer t) {
                        if (t == 3) {
                            cancel();
                        }
                        System.out.println(t);
                        request(1);
                    }
    
                    @Override
                    public void onError(Throwable t) {
                        t.printStackTrace();
                    }
    
                    @Override
                    public void onComplete() {
                        System.out.println("Done!");
                    }
    
                    // 重写onDispose方法监听释放时机
                    @Override
                    protected void onDispose() {
                        System.out.println("订阅已被释放");
                    }
                });
    
  • 使用doOnDispose()操作符:在Flowable链中添加doOnDispose()操作,订阅被释放时会执行传入的回调:
    Disposable d =
        Flowable.range(1, 5)
                .doOnDispose(() -> System.out.println("订阅已被释放"))
                .subscribeWith(new DisposableSubscriber<Integer>() {
                    @Override
                    public void onStart() {
                        request(1);
                    }
    
                    @Override
                    public void onNext(Integer t) {
                        if (t == 3) {
                            cancel();
                        }
                        System.out.println(t);
                        request(1);
                    }
    
                    @Override
                    public void onError(Throwable t) {
                        t.printStackTrace();
                    }
    
                    @Override
                    public void onComplete() {
                        System.out.println("Done!");
                    }
                });
    

内容的提问来源于stack exchange,提问作者Doua Beri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:32:18