【问题标题】:What's the purpose of combining coroutine contexts in Kotlin?在 Kotlin 中组合协程上下文的目的是什么?
【发布时间】:2020-06-15 13:27:02
【问题描述】:

https://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html#combining-context-elements

官方文档说我可以结合一些协程上下文,但是这样做的目的是什么,效果是什么? 这是否意味着协程的生命周期仅限于两种上下文?

【问题讨论】:

    标签: android kotlin kotlin-coroutines kotlin-android-extensions


    【解决方案1】:

    我认为您混淆了CoroutineContextCoroutineDispatcher(可能还有CoroutineScope)。 Dispatcher 只是一种 Context。其他可以是例如。 JobCoroutineNameCoroutineExceptionHandler。您可以组合其中的多个 - 例如。设置调度程序和错误处理程序 - 但每种类型只有一个。

    组合多个调度器没有意义,只会应用最后一个。

    我在 KotlinConf 2019 上找到了 the talk Coroutines! Gotta catch 'em all! by Florina Muntenescu & Manuel Vivo,它很好地解释了其中的一些内容。

    【讨论】:

      【解决方案2】:

      我可以结合一些协程上下文,但是这样做的目的是什么,效果是什么?

      协程上下文基本上是一个不可变的映射。当您组合两个不可变映射时,您会得到一个包含组成映射的所有键的映射。显然,如果两个映射都包含给定的键,则生成的映射不能包含它两次。相反,右手地图优先。

      map 范式的一个小改动是您没有将 (key, value) 对放入上下文中,而是您放入的每个值都已经有一个与之关联的键。这就是为什么每个上下文元素本身已经是一个上下文。

      例如,这是两个成熟的上下文:

      val ioCtx = Dispatchers.IO
      val jobCtx = Job()
      

      您可以将它们组合起来:

      val ioAndJob = ioCtx + jobCtx
      

      您可以通过键访问元素:

      val job = ioAndJob[Job]
      

      您可以将上下文与碰撞键结合起来:

      val defaultAndJob = ioAndJob + Dispatchers.Default
      

      这是否意味着协程的生命周期仅限于两种上下文?

      协程上下文不限制协程生命周期。一些外部机构需要在协程上下文中取消作业。您可能已经将此与处理此问题的CoroutineScope 混淆了。 CoroutineScope 只是一个具有单个属性的对象,coroutineContext,但是由于诸如 launchasync 之类的协程构建器将其作为接收器,因此可以轻松构建可以集中取消的协程层次结构。

      【讨论】:

        猜你喜欢
        • 2019-06-22
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 2018-11-15
        • 1970-01-01
        • 2018-10-25
        相关资源
        最近更新 更多