Observable触发onError后是否会调用onComplete?资源释放需同时处理双回调吗?
关于Observable的onError、onComplete通知及资源清理的疑问解答
嘿,咱们来逐个解决你的问题:
问题1:Observable调用onError()后,还会触发onComplete()吗?
答案是绝对不会。这是ReactiveX Observable的核心契约之一:
- 一个Observable可以先发射0到多次
onNext事件 - 之后它只能发送**要么
onComplete、要么onError**这两种终止事件中的一种,二者不会同时出现 - 一旦发送了终止事件,这个Observable就彻底结束了,不会再发送任何其他通知
所以只要onError被调用,onComplete就没有机会被触发了,反过来也一样。
问题2:把资源清理逻辑同时放在onError和onComplete里,这种做法正确吗?
完全正确!因为根据刚才说的契约,Observable只会触发其中一个终止事件,你的清理代码只会被执行一次,不会出现重复释放资源的问题。
不过我可以给你提个更简洁的方案——用doFinally操作符。它专门用来处理这种“无论流正常结束还是出错都要执行的逻辑”,能帮你避免在两个回调里写重复代码:
yourObservable .doFinally(() -> { // 在这里统一写资源清理逻辑,比如关闭IO连接、释放缓存等 cleanUpYourResources(); }) .subscribe( data -> { /* 处理每个发射的数据 */ }, throwable -> { /* 处理错误情况 */ }, () -> { /* 处理正常完成 */ } );
要是你因为项目限制或者个人习惯不想用doFinally,那分别在onError和onComplete里写清理逻辑也是完全合规的,只要保证两处的逻辑一致就行。
再强调一遍:ReactiveX的契约严格保证了Observable只会发送一个终止通知,所以你的清理逻辑只会执行一次,不用担心重复操作的风险。
内容的提问来源于stack exchange,提问作者Andrew Lam
相关产品推荐
相关产品推荐

