kotlin - 在当前上下文中如何访问 Kotlin 协程元素?
问题描述
我正在尝试了解协程在 Kotlin 中的工作方式。我已经在线阅读了几篇文章,包括这篇文章 - https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad - 但我仍然对如何访问当前上下文中的协程元素感到有些困惑。这是让我感到困惑的部分。
当前上下文中的元素可以通过顶层挂起的 coroutineContext 只读属性获取。
println("Running in ${coroutineContext[CoroutineName]}")
在这种情况下,CoroutineName
是对映射到CoroutineName
元素的键的引用。我了解该get
方法coroutineContext
查看提供给它的键的通用类型 - 在这种情况下,CoroutineName
- 以获取适当的元素。当它们不是接收器的属性时,我试图理解的是如何 CoroutineName
,或者就此而言Job
,CoroutineExceptionHandler
或者甚至可以在当前范围内引用。CoroutineDispatcher
CoroutineScope
解决方案
您可以运行以下一些简单代码来阐明您的理解:
fun main() {
GlobalScope.launch {
println(this)
println(GlobalScope)
}
Thread.sleep(100)
}
它会打印
StandaloneCoroutine{Active}@b4642b3
kotlinx.coroutines.GlobalScope@72445c73
这应该让您清楚,您启动协程的范围不是您的协程构建器块的接收器范围。您获得的范围是由该launch
函数创建的,该函数使用名称和您看到的所有其他内容填充它。
这种机制更神奇的部分是它coroutineContext
不仅在内部可用launch
,而且在 anysuspend fun
中作为全局属性可用。launch
它评估您在块中看到的相同上下文。
推荐阅读
- javascript - MongoDB - 在聚合中不使用键字段构造数组
- javascript - 保持在屏幕上的 HTML 和 CSS 工具提示
- influxdb - 无法访问 Influxdb Web UI。它显示 404 page not found 错误
- java - 具有不同 jdk 版本的 jenkins 管道
- r - 如何在 ggplot2 的多面图的单个标签中使用特殊字符、上标或下标?
- node.js - 图像和 css 不适用于 Handlebars
- compiler-errors - 从在 X86 上运行的 Ubuntu 交叉编译 C 程序到 Alpha ISA
- c# - 如何禁止用户在 Windows 窗体中将窗体拖动到屏幕边缘之外
- blockchain - Truffle 迁移未部署到 Ganache
- python - Python 套接字绑定报告端口已被使用,但套接字 connect_ex 返回 0