首页 > 解决方案 > doCancel 回调的调用量是否与 observable 终止后 doOnSubscribe 的调用量相同?

问题描述

所以,问题就在标题中。
这只是一个小片段,说明了我的假设。

考虑如下链:

var c = 0
fun getItemsFromDb(): Observable<Data>

getItemsFromDb()
  .doOnSubscribe { c++ }
  .doOnCancel { c-- }

是否有保证,最终,当可观察对象完全终止时,c == 0

标签: rx-java

解决方案


只有在实际取消时才会调用No. doOnCancel,例如:

getItemsFromDb()
  .doOnSubscribe { c++ }
  .doOnCancel { c-- }
  .take(1)
  .subscribe()

在这里,take(1)将在一个项目之后发出取消,所以c == 0在最后。

var d = getItemsFromDb()
  .delaySubscription(5, TimeUnit.SECONDS, Schedulers.io())
  .doOnSubscribe { c++ }
  .doOnCancel { c-- }
  .subscribe()

Thread.sleep(1000)

d.dispose()

在这里,消费者端是手动处理的,而消费者端又会doOnCancel再次调用,最终导致c == 0

如果您想在任何情况下调用一些回调,请使用doFinally

getItemsFromDb()
  .doOnSubscribe { c++ }
  .doFinally { c-- }

推荐阅读