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

RXJava中Observable执行onComplete后doFinally未触发,如何主动调用?

RxJava中doFinally在onComplete后未触发的原因及解决方法

问题根源

RxJava里的Observable是不可变对象,所有操作符(包括doFinally)执行后都会返回一个全新的Observable实例,不会修改原对象本身。你之前的代码只是调用了doFinally,但完全没有订阅这个新生成的Observable,所以doFinally里的逻辑根本没机会执行。

修正后的代码

把doFinally链式连接到Observable上,再订阅这个新的Observable,就能触发doFinally的逻辑了:

import io.reactivex.rxjava3.core.Observable;

public class Main {
    public static void main(String args[]) {
        test();
    }

    public static void test() {

        System.out.println("Start");
        Observable<Integer> observable = Observable.create(emitter -> {
            emitter.onNext(1);
            emitter.onComplete();
        });

        // 将doFinally与原Observable链式调用后再订阅
        observable.doFinally(() -> System.out.println("Test do finally before"))
                  .blockingSubscribe(System.out::println, System.out::println, () -> {
                      System.out.println("ON Complete");
                  });

        // 也可以重新赋值observable后再订阅
        observable = observable.doFinally(() -> System.out.println("Test do finally after"));
        observable.blockingSubscribe(); // 订阅触发doFinally

        System.out.println("End");
    }
}

修正后的输出

Start
1
ON Complete
Test do finally before
Test do finally after
End

关于主动调用doFinally

doFinally是绑定Observable生命周期的操作符,它的执行完全依赖于Observable的生命周期事件(发送onComplete/onError信号,或者下游取消订阅),没办法直接主动调用它。但你可以通过以下方式间接触发:

  • 订阅添加了doFinally的Observable,让它走完生命周期(比如发送onComplete)
  • 手动取消Observable的订阅(比如用Disposable.dispose())
  • 让Observable发送onError信号

内容的提问来源于stack exchange,提问作者Jay Dharmendra Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:02:46