【问题标题】: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。
创建自定义作用域而不是使用内置作用域(如 lifecycleScope、viewModelScope 或 GlobalScope)的目的是为了控制某些与生命周期对象(活动或片段)或 ViewModel。
【解决方案2】:
Kotlin 协程仍然是一个相对较新的功能,它们在 2017-2019 年经历了很多演变。出于这个原因,网络上流传着大量内容,这些内容引用了曾经是最佳实践但现在已经过时的模式。创建您自己的 Job 实例以将其放入范围就是一个很好的例子。在首次引入结构化并发和范围时,Android 库中仍然不支持它们,所以这是最好的方法。
今天,只有某些特殊情况的生命周期才需要这种方法。
我还要指出,范围不是您“启动”的任何东西,它只是一个简单的数据对象,它包装了CoroutineContext 的实例,其目的是使构建协程层次结构变得容易,因为它既是协程构建器函数,并绑定到构建器体内的this。
此外,当您创建 CoroutineScope 而未显式包含 Job 时,会自动向其添加一个实例。
【解决方案3】:
显然为时已晚,但如果你想在全球范围内管理你的协程,你可以这样做:
private val scope = CoroutineScope(Dispatchers.IO)
private var job = scope.coroutineContext.job