前言

简单介绍supervisorScope函数,它用于创建一个使用了 SupervisorJob 的 coroutineScope,
该作用域的特点:抛出的异常,不会 连锁取消 同级协程和父协程。

看过很多supervisorScope {}文档的使用,我照抄一摸一样的代码,运行就崩溃,最后找到了解决方法,应该是kotlin版本更新做过改动,当前我使用的是androidx.core:core-ktx:1.9.0

解决方法

需要将CoroutineExceptionHandler,作为参数,才有效果,不然会崩溃。

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")}}