我正在尝试了解协程在Kotlin中的工作方式。我已经在线阅读了几篇文章,包括https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad在内,但是我仍然对如何访问当前上下文中的协程元素感到困惑。这是令我困惑的部分。
在这种情况下,CoroutineName
是对映射到CoroutineName
元素的键的引用。我知道get
上的coroutineContext
方法查看提供给它的密钥的通用类型-在这种情况下为CoroutineName
-以获取适当的元素。我想了解的是,在不是CoroutineName
接收器的属性的情况下,Job
,或者就此而言,CoroutineExceptionHandler
,CoroutineDispatcher
或CoroutineScope
甚至可以在当前范围内引用。
最佳答案
这些所有coroutine context elements都有一个属性key
,用于在协程环境中寻址元素(这是一种可寻址的集合)。 CoroutineName
和其他上下文元素一样,将键定义为对象:
companion object Key : Key<CoroutineName>
In Kotlin,您可以使用类名称访问类的伴侣对象:
因此,我认为这两个表达式将是相同的:
coroutineContext[CoroutineName]
coroutineContext[CoroutineName.Key]
关于SO上的伴随对象的另一个大问题:What is the point of naming a companion object in kotlin
顺便说一句,您可以按ctrl键并单击IDEA中
CoroutineName
中的coroutineContext[CoroutineName]
,然后自己查看声明。