Kotlin协程GlobalScope.launch与runBlocking

时间:2019-02-23 13:35:07

标签: kotlin kotlinx.coroutines kotlin-coroutines

这两种方法之间有什么区别吗?

runBlocking {
   launch(coroutineDispatcher) {
      // job
   }
}
GlobalScope.launch(coroutineDispatcher) {
   // job
}

1 个答案:

答案 0 :(得分:6)

  

runBlocking运行新的协程并中断当前线程,直到完成为止。协程不应该使用此功能。它旨在将常规的阻塞代码桥接到以挂起方式编写的库中,以用于主要功能和测试中。

// line 1
runBlocking {
   // line 2
   launch(coroutineDispatcher) {
      // line 3
   }
   // line 4
}
// line 5
someFunction()

如果使用runBlocking行代码,将按以下顺序执行:

line 1
line 2
line 4
line 3
line 5 // this line will be executed after coroutine is finished
  

全局作用域用于启动在整个应用程序生命周期内运行且不会过早取消的顶级协程。全局范围的另一种用法是在Dispatchers.Unconfined中运行的运算符,它们没有任何关联的工作。   应用程序代码通常应使用应用程序定义的CoroutineScope,强烈建议不要在GlobalScope实例上使用异步或启动。

// line 1
GlobalScope.launch(coroutineDispatcher) {
   // line 2
}
// line 3
someFunction()

如果使用GlobalScope.launch行代码,将按以下顺序执行:

line 1
line 3
line 2

因此runBlocking会阻塞当前线程,直到完成为止,GlobalScope.launch不会。