Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。相关的知识,希望对你有一定的参考价值。

coroutineScope与runBlocking 区别

runBlocking 是常规函数,而 coroutineScope 是挂起函数

他们都会等待其协程体以及所有子协程结束,主要区别在于runBolocking方法会阻塞当前线程来等待。而coroutineScope只是挂起,会释放底层线程用于其他用途。

runBlocking 代码范例
        binding.btClick7.setOnClickListener 
            runBlocking 

                val job1 = async 
                    delay(1000)
                    Log.e(TAG, "job1 finished")
                    throw IllegalArgumentException()

                


                val job2 = async 
                    delay(2000)
                    Log.e(TAG, "job2 finished")
                

            
            Log.e(TAG, "thread:A")
        

 app会闪退

那么换成coroutineScope 

          runBlocking 
                coroutineScope 
                    val job1 = async 
                        delay(1000)
                        Log.e(TAG, "job1 finished")
                        throw IllegalArgumentException()

                    


                    val job2 = async 
                        delay(2000)
                        Log.e(TAG, "job2 finished")
                    
                


            
            Log.e(TAG, "thread:A")
        

 

 app不会闪退。下面将会不执行。

那么如果想报错了以后其余的不影响,使用supervisorScope ,如何操作

    binding.btClick7.setOnClickListener 
            runBlocking 
                supervisorScope 
                    val job1 = async 
                        delay(1000)
                        Log.e(TAG, "job1 finished")
                        throw IllegalArgumentException()

                    


                    val job2 = async 
                        delay(2000)
                        Log.e(TAG, "job2 finished")
                    
                


            
            Log.e(TAG, "thread:A")
        

 coroutineScope 一个协程失败了。所有其他的协程会被取消掉

supervisorScope  一个协程失败了。不会影响其他的兄弟协程。

以上是关于Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

kotlin 协程。作用域的取消,兄弟协程的取消,协程取消会异常

Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )

Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )

深入理解Kotlin协程协程作用域启动模式调度器异常和取消使用篇