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
相关产品推荐
相关产品推荐

