Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java doAfterTerminate和doFinally之间的差异_Java_Rx Java2 - Fatal编程技术网

Java doAfterTerminate和doFinally之间的差异

Java doAfterTerminate和doFinally之间的差异,java,rx-java2,Java,Rx Java2,有人知道RxJava 2中运算符“doAfterTerminate”和“doFinally”之间的区别吗?区别在于,如果下游除了常规的onError或onComplete终止路径之外取消/处理序列,那么doFinally执行提供的操作。这允许通过这三种方式清理和释放资源。操作员还保证,即使onError或onComplete发出与取消竞争的信号,操作也会在每次订阅时执行一次 相反,doafterminate仅涵盖onError和onComplete 您可以使用doafterminate+doOn

有人知道RxJava 2中运算符“doAfterTerminate”和“doFinally”之间的区别吗?

区别在于,如果下游除了常规的
onError
onComplete
终止路径之外取消/处理序列,那么
doFinally
执行提供的
操作。这允许通过这三种方式清理和释放资源。操作员还保证,即使
onError
onComplete
发出与取消竞争的信号,操作也会在每次订阅时执行一次

相反,
doafterminate
仅涵盖
onError
onComplete


您可以使用
doafterminate
+
doOnCancel
模拟
doFinally
,但是,在拆分操作时,操作参数可能会被执行,并导致非幂等清理逻辑出现问题。

您看过它们的JavaDoc:和吗?谢谢!我已经看过了,但没有看过你的链接。在一些测试之后,doFinally()似乎在下游调度程序上运行,这是真的还是我遗漏了什么?它在触发终止的调度程序上运行,可能是上游或下游调度程序。除了使用
Schedulers.xxx().scheduleDirect
执行真正的清理操作外,您可以做的事情不多。我无法直接访问计划程序进行清理,因此在我的情况下,我无法使用scheduleDirect()。但是,我刚刚发现操作符unsubscribeOn()会影响doFinally(),这更适合我的情况。所以我有一个小问题,doFinally()是否保证在unsubscribeOn()上分配的调度程序上运行?如果序列正常完成,它将在该调度程序上运行。如果序列以onError或onCompleted终止,则上游的线程将用于执行该操作。如果在此之前已释放该序列,则调用dispose的线程将运行该操作。