Kotlin 异步作业取消导致父级取消
我尝试运行两个异步作业 单击时有一个按钮,将取消其中一个作业。但我注意到,当我这样做的时候,其他的工作也会被取消 发生了什么事Kotlin 异步作业取消导致父级取消,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我尝试运行两个异步作业 单击时有一个按钮,将取消其中一个作业。但我注意到,当我这样做的时候,其他的工作也会被取消 发生了什么事 class SplashFragment : BaseFragment(R.layout.fragment_splash), CoroutineScope by MainScope() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCrea
class SplashFragment : BaseFragment(R.layout.fragment_splash), CoroutineScope by MainScope() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
launch {
val countdown = async { countDown() }
val ipAndMaintain = async { checkIPAndMaintain() }
btnSkip.onClick {
countdown.cancel() // cancel countdown
btnSkip.isVisible = false
if (!ipAndMaintain.isCompleted) {
showLoadingDialog()
}
}
countdown.await()
startOtherPage(ipAndMaintain.await())
}
}
private suspend fun countDown() {
var time = 3
while (time >= 0) {
btnSkip.text = getString(R.string.skip, time)
delay(1000)
yield()
time--
}
}
private suspend fun checkIPAndMaintain(): Int {
delay(2000)
return 1
}
}当您对已取消的
延迟的调用wait
时,它会引发异常。如果您没有捕获它,那么它将被传播到父协同程序,父协同程序将取消其所有子项。用try catch
块包装您的倒计时.wait()
指令,您将看到另一个协同程序继续。这就是结构化并发的效果
您可以阅读有关该主题的内容。当您在取消的延迟的上调用等待
时,它会引发异常。如果您没有捕获它,那么它将被传播到父协同程序,父协同程序将取消其所有子项。用try catch
块包装您的倒计时.wait()
指令,您将看到另一个协同程序继续。这就是结构化并发的效果
您可以阅读有关该主题的内容。结构化并发的另一个影响是,如果async{countDown()}
失败,它也会导致父级及其所有子级被取消,无论您是否从wait()
@MarkoTopolnik()捕获异常。谢谢。结构化并发的另一个影响是,如果async{countDown()}
失败,它还将导致父级及其所有子级被取消,无论您是否从wait()
捕获异常@MarkoTopolnik获得它。谢谢