【问题标题】:What is exactly for Custom Coroutine Scope?Custom Coroutine Scope 到底是什么?
【发布时间】:2023-01-23 14:08:37
【问题描述】:

我对 coroutines-dispatchers-lifecycle scopes-async await 了解得够多了。 很明显,所有 scope.launch 函数都返回我们可以管理协程生命周期的作业。 我唯一不明白的是我们用自定义作业创建的自定义范围。

例如:

val myJob = Job()

val customCoroutineScope= CoroutineScope(Dispatchers.IO+myJob)

我认为在这些代码 sn-p 之后我可以启动范围并管理它的生命周期和 myJob 参考资料 但它没有用。 有人可以向我解释此自定义范围界定的目的和好处吗?

【问题讨论】:

    标签: android kotlin asynchronous kotlin-coroutines coroutinescope


    【解决方案1】:

    我认为您没有任何理由想要将常规作业传递给 CoroutineScope 构造函数。如果你要通过一个工作,它应该是使用SupervisorJob()创建的。传递 SupervisorJob 的目的是让您的 CoroutineScope 启动的协同程序可以彼此独立地失败,而不是任何单独的失败导致取消 CoroutineScope 中的所有作业。

    没有太多理由保留对您的 SupervisorJob 的引用并使用它来管理您的 CoroutineScope。只需从您的 CoroutineScope 参考管理您的 CoroutineScope。

    创建自定义作用域而不是使用内置作用域(如 lifecycleScopeviewModelScopeGlobalScope)的目的是为了控制某些与生命周期对象(活动或片段)或 ViewModel。

    【讨论】:

      【解决方案2】:

      Kotlin 协程仍然是一个相对较新的功能,它们在 2017-2019 年经历了很多演变。出于这个原因,网络上流传着大量内容,这些内容引用了曾经是最佳实践但现在已经过时的模式。创建您自己的 Job 实例以将其放入范围就是一个很好的例子。在首次引入结构化并发和范围时,Android 库中仍然不支持它们,所以这是最好的方法。

      今天,只有某些特殊情况的生命周期才需要这种方法。

      我还要指出,范围不是您“启动”的任何东西,它只是一个简单的数据对象,它包装了CoroutineContext 的实例,其目的是使构建协程层次结构变得容易,因为它既是协程构建器函数,并绑定到构建器体内的this

      此外,当您创建 CoroutineScope 而未显式包含 Job 时,会自动向其添加一个实例。

      【讨论】:

        【解决方案3】:

        显然为时已晚,但如果你想在全球范围内管理你的协程,你可以这样做:

        private val scope = CoroutineScope(Dispatchers.IO)
        private var job = scope.coroutineContext.job
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-06
          • 2013-05-05
          • 2010-11-19
          • 2012-06-16
          • 2011-04-02
          • 2016-04-13
          • 2012-03-07
          相关资源
          最近更新 更多