【发布时间】:2020-03-16 05:18:19
【问题描述】:
我正在尝试了解协程在 Kotlin 中的工作原理。我已经在线阅读了几篇文章,包括这篇文章 - https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad - 但我仍然对如何访问当前上下文中的协程元素感到有些困惑。这是让我感到困惑的部分。
当前上下文中的元素可以通过顶层挂起的coroutineContext只读属性获取。
println("Running in ${coroutineContext[CoroutineName]}")
在这种情况下,CoroutineName 是对映射到 CoroutineName 元素的键的引用。我知道coroutineContext 上的get 方法会查看提供给它的键的通用类型(在本例中为CoroutineName)以获取适当的元素。我想了解的是CoroutineName,或者就此而言,Job、CoroutineExceptionHandler 或CoroutineDispatcher 甚至可以在当前范围内引用,当它们不是CoroutineScope 接收器的属性时.
【问题讨论】:
-
我不确定你到底在问什么,但这里有一个猜测:当你取消引用全局
coroutineContext属性时,你在某种程度上触及了一个“神奇”的 Kotlin 内在函数无法通过检查源代码来解释,为您提供当前有效的协程上下文。源码here. -
当你说,
launch一个新的协程时,coroutineContext可以作为CoroutineScope的成员使用,它是你传递给launch的块上的接收器.但是,我想知道的是我们如何能够访问coroutineContext[CoroutineName]。CoroutineName在当前范围内如何可供我们用作coroutineContext提供的地图的索引?