【发布时间】:2022-01-05 12:43:31
【问题描述】:
在 Kotlin 中有多种启动协程的方法。我发现了几个使用GlobalScope 和CoroutineScope 的例子。但是后者是在启动协程时直接创建的:
-
使用
GlobalScope:fun loadConfiguration() { GlobalScope.launch(Dispatchers.Main) { val config = fetchConfigFromServer() // network request updateConfiguration(config) } } -
使用
CoroutineScope实例,在启动协程时直接创建:fun loadConfiguration() { CoroutineScope(Dispatchers.Main).launch { val config = fetchConfigFromServer() // network request updateConfiguration(config) } }
在这种情况下,这两种方法有区别吗?
第二种情况不违反principle of structured concurrency吗?
【问题讨论】:
-
@ADM,谢谢你的链接,好像就是这样。
-
是的,第二个是反模式。如果您不打算存储对它的引用或管理其生命周期,则没有理由创建新范围。并且在某些情况下使用 GlobalScope 是一种代码异味,至少经常会在您使用它时默认显示编译器警告。我认为他们创造了一个过度使用它的新手怪物,因为他们在所有基本示例中都使用了它。
标签: android kotlin kotlin-coroutines coroutinescope structured-concurrency