在可观察对象终止后调用 doCancel 回调的次数是否与调用 doOnSubscribe 的次数相同?

Is the amount of invoking of the doCancel callback the same with the amount of invoking of the doOnSubscribe after terminating of the observable?

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

考虑如下链:

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

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

是否可以保证,最终,当 observable 完全终止时,c == 0

没有。 doOnCancel 仅在实际取消时调用,例如:

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

这里,take(1)会在一个item后发出取消,所以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-- }