这两种方法有什么区别吗?
runBlocking {
launch(coroutineDispatcher) {
// job
}
}
GlobalScope.launch(coroutineDispatcher) {
// job
}
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
没有。