rx-java - doCancel 回调的调用量是否与 observable 终止后 doOnSubscribe 的调用量相同?
问题描述
所以,问题就在标题中。
这只是一个小片段,说明了我的假设。
考虑如下链:
var c = 0
fun getItemsFromDb(): Observable<Data>
getItemsFromDb()
.doOnSubscribe { c++ }
.doOnCancel { c-- }
是否有保证,最终,当可观察对象完全终止时,c == 0
?
解决方案
只有在实际取消时才会调用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-- }
推荐阅读
- swift - 使用枚举创建自定义视图
- r - 在 r 中合并两个大型数据集时的内存分配问题
- angular - 在服务应用程序时观看外部本地库
- android - 迁移到 androidX 后出现运行时错误
- python - Cythonize 在不同包下具有相同名称的 python 模块
- visual-studio - MSBuild 错误 - 程序不包含适合入口点的静态“Main”方法
- c++ - Boost.beast http::read() 返回 `bad version`
- react-native - React Native /查找并应用平面列表背景颜色的第n个孩子?
- amazon-web-services - 具有资源策略的 aws api 网关的 terraform 循环依赖
- swift - 当我从依赖项目(框架)调用方法时,Swift 应用程序崩溃