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

在这种情况下,CoroutineName是对映射到CoroutineName元素的键的引用。我知道get上的coroutineContext方法查看提供给它的密钥的通用类型-在这种情况下为CoroutineName-以获取适当的元素。我想了解的是,在不是CoroutineName接收器的属性的情况下,Job,或者就此而言,CoroutineExceptionHandlerCoroutineDispatcherCoroutineScope甚至可以在当前范围内引用。

最佳答案

这些所有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],然后自己查看声明。

10-08 03:07