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

