我还没有完全掌握 Kotlin 协程。
基本上我希望协程在执行之前等待任何先前的调用完成。下面的代码似乎可以工作。但它正在做我认为它正在做的事情吗?
private var saveJob: Job? = null
fun save() {
saveJob = someScope.launch {
saveJob?.join()
withContext(Dispatchers.IO) {
// suspending database operation
}
}
}
据我所知,代码正在执行我想要的操作。但真的是这样吗?
请记住,launch
ed 代码与其外部的代码是并发的。这意味着您编写的内容存在竞争条件:外部代码可能已经将新作业分配给saveJob
当你尝试join()
,从而导致僵局。
我猜你想要的是触发一个save
操作在后台进行,操作本身会从其他地方提取所有数据并保存。您可能不想要排队save
工作,只需确保在您调用时保存所有内容即可save()
。如果你打电话save
稍早一点并且新的保存作业尚未开始,这两个调用可以合并为一个save
手术。
此外,你说你有一个暂停数据库操作。暂停代码不属于IO
调度程序,仅当您必须执行许多操作时才存在blocking同时进行操作。
总而言之,我建议使用演员:
val actor = someScope.actor<Unit>(capacity = CONFLATED) {
// suspending database operation
}
fun save() = someScope.launch {
actor.send(Unit)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)