前言
简单介绍supervisorScope函数,它用于创建一个使用了 SupervisorJob 的 coroutineScope,
该作用域的特点:抛出的异常,不会 连锁取消 同级协程和父协程。
看过很多 supervisorScope {} 文档的使用,我照抄一摸一样的代码,运行就崩溃,最后找到了解决方法,应该是kotlin版本更新做过改动,当前我使用的是 androidx.core:core-ktx:1.9.0文章来源:https://www.toymoban.com/news/detail-823952.html
解决方法
需要将CoroutineExceptionHandler,作为参数,才有效果,不然会崩溃。文章来源地址https://www.toymoban.com/news/detail-823952.html
private fun test() {
// 原来的写法,现在会崩溃
// runBlocking {
// Log.d("TAG", "Start")
// launch {
// delay(100)
// Log.d("TAG", "Task from runBlocking")
// }
// supervisorScope {
// val firstChild = launch {
// Log.d("TAG", "First Child")
// throw AssertionError("First child is cancelled")
// }
// val secondChild = launch {
// Log.d("TAG", "Second Child")
// }
// Log.d("TAG", "Cancelling supervisor")
// }
// Log.d("TAG", "End")
// }
// 最新的写法
runBlocking {
Log.d("TAG", "Start")
launch {
delay(100)
Log.d("TAG", "Task from runBlocking")
}
supervisorScope {
// 需要将CoroutineExceptionHandler,作为参数,才有效果,不然会崩溃
val firstChild = launch(CoroutineExceptionHandler { _, _ -> }) {
Log.d("TAG", "First Child")
throw AssertionError("First child is cancelled")
}
val secondChild = launch {
Log.d("TAG", "Second Child")
}
Log.d("TAG", "Cancelling supervisor")
}
Log.d("TAG", "End")
}
}
到了这里,关于Kotlin 协程 supervisorScope {} 运行崩溃解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!