Kotlin与GlobalScope.launch对比runBlocking

问题描述 投票:1回答:1

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

runBlocking {
   launch(coroutineDispatcher) {
      // job
   }
}
GlobalScope.launch(coroutineDispatcher) {
   // job
}
kotlin kotlinx.coroutines kotlin-coroutines
1个回答
7
投票

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没有。

© www.soinside.com 2019 - 2024. All rights reserved.