Java doAfterTerminate和doFinally之间的差异
有人知道RxJava 2中运算符“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
onError
或onComplete
终止路径之外取消/处理序列,那么doFinally
执行提供的操作。这允许通过这三种方式清理和释放资源。操作员还保证,即使onError
或onComplete
发出与取消竞争的信号,操作也会在每次订阅时执行一次
相反,doafterminate
仅涵盖onError
和onComplete
您可以使用doafterminate
+doOnCancel
模拟doFinally
,但是,在拆分操作时,操作参数可能会被执行,并导致非幂等清理逻辑出现问题。您看过它们的JavaDoc:和吗?谢谢!我已经看过了,但没有看过你的链接。在一些测试之后,doFinally()似乎在下游调度程序上运行,这是真的还是我遗漏了什么?它在触发终止的调度程序上运行,可能是上游或下游调度程序。除了使用Schedulers.xxx().scheduleDirect
执行真正的清理操作外,您可以做的事情不多。我无法直接访问计划程序进行清理,因此在我的情况下,我无法使用scheduleDirect()。但是,我刚刚发现操作符unsubscribeOn()会影响doFinally(),这更适合我的情况。所以我有一个小问题,doFinally()是否保证在unsubscribeOn()上分配的调度程序上运行?如果序列正常完成,它将在该调度程序上运行。如果序列以onError或onCompleted终止,则上游的线程将用于执行该操作。如果在此之前已释放该序列,则调用dispose的线程将运行该操作。