首页 > 解决方案 > 在当前上下文中如何访问 Kotlin 协程元素?

问题描述

我正在尝试了解协程在 Kotlin 中的工作方式。我已经在线阅读了几篇文章,包括这篇文章 - https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad - 但我仍然对如何访问当前上下文中的协程元素感到有些困惑。这是让我感到困惑的部分。

当前上下文中的元素可以通过顶层挂起的 coroutineContext 只读属性获取。

println("Running in ${coroutineContext[CoroutineName]}")

在这种情况下,CoroutineName是对映射到CoroutineName元素的键的引用。我了解该get方法coroutineContext查看提供给它的键的通用类型 - 在这种情况下,CoroutineName- 以获取适当的元素。当它们不是接收器的属性时,我试图理解的是如何 CoroutineName,或者就此而言JobCoroutineExceptionHandler或者甚至可以在当前范围内引用。CoroutineDispatcherCoroutineScope

标签: kotlinkotlin-coroutines

解决方案


您可以运行以下一些简单代码来阐明您的理解:

fun main() {
    GlobalScope.launch {
        println(this)
        println(GlobalScope)
    }
    Thread.sleep(100)
}

它会打印

StandaloneCoroutine{Active}@b4642b3
kotlinx.coroutines.GlobalScope@72445c73

这应该让您清楚,您启动协程的范围不是您的协程构建器块的接收器范围。您获得的范围是由该launch函数创建的,该函数使用名称和您看到的所有其他内容填充它。

这种机制更神奇的部分是它coroutineContext不仅在内部可用launch,而且在 anysuspend fun中作为全局属性可用。launch它评估您在块中看到的相同上下文。


推荐阅读