Kotlin 当嵌套的错误处理程序调用OneExceptionResumeNext时,Observable停止发送

Kotlin 当嵌套的错误处理程序调用OneExceptionResumeNext时,Observable停止发送,kotlin,rx-java2,Kotlin,Rx Java2,在下面的代码中,我有一个嵌套的observable。flatMap中的sendMessage调用sendMessage函数,该函数也是一个可观察函数。如果在这个嵌套的可观察对象中发生异常,则假定OneExceptionResumeNext捕捉异常,处理异常,然后继续,就好像什么都没有发生一样。异常确实会被捕获,但一旦异常处理完成,流中就不会产生进一步的排放。甚至连doOnComplete都不叫。本质上,OneExceptionResume next只是挂起 我试过一个项目,但结果相同。我在Sta

在下面的代码中,我有一个嵌套的observable。flatMap中的sendMessage调用sendMessage函数,该函数也是一个可观察函数。如果在这个嵌套的可观察对象中发生异常,则假定OneExceptionResumeNext捕捉异常,处理异常,然后继续,就好像什么都没有发生一样。异常确实会被捕获,但一旦异常处理完成,流中就不会产生进一步的排放。甚至连doOnComplete都不叫。本质上,OneExceptionResume next只是挂起

我试过一个项目,但结果相同。我在Stackoverflow或其他地方没有发现一个例子,它甚至在嵌套的observable中显示了OneExceptionResumeNext或OneRorResumeNext或OneRorReturnItem,在对其进行了一天的工作之后,我怀疑可能不可能支持嵌套的错误处理程序

注意:在OneExceptionResumeNext中,我目前刚刚返回

Observable.empty<MessageToSend>()

如果在OneExceptionResumeNext内的行上放置断点,则每次第一次运行observable时,它都会被调用,而不仅仅是在抛出异常时。这显然是RxJava文档中未标识的行为。任何开发人员都会觉得只有在抛出异常时才会调用它。在上面的示例中,将值设置为10实际上不是问题。它实际上只是为异常发生时的情况设置返回值。然而,如果这是一个更复杂的代码,用于存储数据库中的内容(我的应用程序就是这样做的),那么当可观察对象被初始化时,它就会被调用,这真的很糟糕。尽管有了这一发现,但它仍然不能解决我的问题,因为没有进一步的项目被释放。我在示例代码中发现,当调用OneExceptionResumeNext时,也会调用onComplete。遗憾的是,文档中也没有提到这一点。

您可能希望使用
defer
延迟函数调用的执行,这些调用会在调用时产生副作用:

Observable<Integer> createFallback() {
    System.out.println("Why is this executing now?!");
    return Observable.empty();
}

Observable.<Integer>error(new Exception())
.onExceptionResumeNext(createFallback())
.subscribe();
现在,如果注释掉错误可观察部分,它是否仍然执行
createFallback()
?是的,RxJava在这一点上还没有涉及

如果您不希望副作用以这种方式发生在
createFallback
上,则必须推迟整个方法的执行,为此有一个操作符:
defer

Observable.<Integer>error(new Exception())
.onExceptionResumeNext(Observable.defer(() -> createFallback()))
.subscribe();

您可能希望使用
defer
来延迟函数调用的执行,这些调用会在调用时产生副作用:

Observable<Integer> createFallback() {
    System.out.println("Why is this executing now?!");
    return Observable.empty();
}

Observable.<Integer>error(new Exception())
.onExceptionResumeNext(createFallback())
.subscribe();
现在,如果注释掉错误可观察部分,它是否仍然执行
createFallback()
?是的,RxJava在这一点上还没有涉及

如果您不希望副作用以这种方式发生在
createFallback
上,则必须推迟整个方法的执行,为此有一个操作符:
defer

Observable.<Integer>error(new Exception())
.onExceptionResumeNext(Observable.defer(() -> createFallback()))
.subscribe();

你把那些
放在哪里了?我在提供的代码中没有看到它。把它放在内部源代码上,它可能会失败,而不是放在主序列中。我使用的是OneExceptionResumeNext,所以上面的代码不会显示OneErrorResumeNext。但如前所述,这并不重要——如果我使用OneRorResumeNext,问题仍然会发生。主流和嵌套流需要自己的错误处理。我只是不完全相信这是可能的。还要记住,完全可以使用包含嵌套可观察对象的第三方库,因此应该可以支持嵌套错误处理。您可以看到,在
onExceptionResumeNext{}
中,花括号创建了一个
observesource.subscribe(observator)
主体,它不做任何事情,并且对您隐藏,因为
它是可选的。将花括号替换为常规大括号,然后查看这是否有助于
OneExceptionResumeNext
。将花括号替换为圆括号会导致始终调用OneExceptionResumeNext。我的假设是圆括号强制调用该方法,而大括号提供匿名回调。你把那些
onErrorResumeNext
放在哪里了?我在提供的代码中没有看到它。把它放在内部源代码上,它可能会失败,而不是放在主序列中。我使用的是OneExceptionResumeNext,所以上面的代码不会显示OneErrorResumeNext。但如前所述,这并不重要——如果我使用OneRorResumeNext,问题仍然会发生。主流和嵌套流需要自己的错误处理。我只是不完全相信这是可能的。还要记住,完全可以使用包含嵌套可观察对象的第三方库,因此应该可以支持嵌套错误处理。您可以看到,在
onExceptionResumeNext{}
中,花括号创建了一个
observesource.subscribe(observator)
主体,它不做任何事情,并且对您隐藏,因为
它是可选的。将花括号替换为常规大括号,然后查看这是否有助于
OneExceptionResumeNext
。将花括号替换为圆括号会导致始终调用OneExceptionResumeNext。我的假设是圆括号强制调用该方法,而大括号提供匿名回调。这很有帮助。谢谢。应该指出的是,虽然您的解决方案解决了OneExceptionResumeNext挂起代码的问题,但我提到的关于OneExceptionResumeNext终止流的另一个问题仍然存在。onComplete仍将被调用。这是不好的,因为给人的印象是,流通常会继续,就好像什么也没发生一样。这显然不是真的。请提供有问题的代码,不要遗漏重要部分。最好的办法是去h
Observable.<Integer>error(new Exception())
.onExceptionResumeNext(Observable.defer(() -> createFallback()))
.subscribe();
Observable.error(new Exception())
.onExceptionResumeNext(Observable.defer { createFallback() })
.subscribe()