【发布时间】:2021-08-24 09:20:50
【问题描述】:
我正在使用 Scope 的类中执行一些工作:
class MyClass(val scope: CoroutineScope) {
private val state: StateFlow<Int> = someFlow()
.shareIn(scope, started = SharingStared.Eagerly, initialValue = 0)
fun save() {
scope.launch {
save(state.value)
}
}
}
现在我想在取消范围时进行清理。做这个的最好方式是什么?我可以想出这个,但这听起来不太稳定。
init {
scope.launch {
try { delay(10000000000000) }
finally { withContext(Noncancellable) { save(state.value) } }
}
}
编辑:我已经修改了我的 sn-p 以更多地反映我正在做的事情。 state Flow 每秒更新几次,当我调用 save() 方法时,我想将状态保存到磁盘(所以我不想在每次状态更改时都这样做)。
接下来,我想在取消范围时保存状态(即在最后)。这就是我遇到麻烦的地方。
【问题讨论】:
-
您要清理什么?所有启动的协程都将在范围取消时被取消,因此在其中运行的所有代码都会抛出
CancellationException。在这些协程的代码中使用finally或use { ... }块将自动清理。 -
@Joffrey 我已经进行了编辑!
-
感谢编辑,我现在知道了。我猜在这种情况下,范围很可能绑定到某种生命周期(您实际上取消它的地方)。我认为直接挂钩该生命周期而不是通过范围间接挂钩可能更合适。
-
是的,这是正确的,虽然我希望这样的事情是可能的。
-
我在我的回答中添加了一个“更清洁”的替代方法来替代您当前的解决方法