协程四(CoroutineScope)

定义协程必须指定其CoroutineScope,它会跟踪所有协程,同样它还可以跟踪取消它所启动的协程.

协程作用域:

  • GlobalScope. 生命周期是process 级别的,即时Activity 或 fragment已经销毁,协程仍然在执行.

  • MainScope. 在Activity 中使用,可以在onDestroy()中取消.

  • viewModelScope. 只能在ViewModel 中使用,绑定ViewModel 的生命周期.

  • lifecycleScope. 只能在Activity,fragment 中使用,会绑定Activity 和 Fragment生命周期.

coroutineScope 与runBlocking 协程作用域
  • runBlocking是常规函数,而coroutineScope 是挂起函数.
  • 它们都会等待其协程以及所有子协程结束, 主要区别在于runBlocking 方法会阻塞当前线程来等待,而coroutineScope只是挂起,会释放底层线程用于其他用途.
coroutineScope 与 supervisorScope 协程作用域
  • coroutineScope: 一个协程失败了,所有其他兄弟协程也会被取消
  • supervisorScope: 一个协程失败了,不会影响其他兄弟协程
        runBlocking {
            coroutineScope {
               val job1 =  launch {
                   delay(400)
                   println("job1 fininsh")
               }


                val job2 = launch {
                    delay(200)
                    println("job2 fininsh")    // ① 程序打印   job2 fininsh
                   throw IllegalArgumentException()    // ② 程序崩溃 协程体取消
                }
            }
        }
        runBlocking {
            coroutineScope {
               val job1 =  launch {
                   delay(400)
                   println("job1 fininsh")   // ② 程序打印   job1 fininsh
               }


                val job2 = async {
                    delay(200)
                    println("job2 fininsh")   //  ① 程序打印   job2 fininsh
                    "HHH"
                   throw IllegalArgumentException()
                }
            }
        }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容