kotlin 自定义协程作用域的确切含义是什么?

ruarlubt  于 2023-01-26  发布在  Kotlin
关注(0)|答案(3)|浏览(164)

我对协程-调度器-生命周期作用域-异步等待有足够的了解。而且很明显,所有的scope. launch函数返回的作业都可以管理协程生命周期。唯一我不明白的是我们用自定义作业创建的自定义作用域。
例如:
val myJob = Job()
val customCoroutineScope= CoroutineScope(Dispatchers.IO+myJob)
我想在这些代码片段之后,我可以启动作用域并使用myJob引用管理其生命周期等,但它不起作用。有人能解释一下这种自定义作用域的目的和好处吗?

8i9zcol2

8i9zcol21#

我不认为你有任何理由想要传递一个常规的Job给CoroutineScope构造函数。如果你要传递一个Job,它应该是一个使用SupervisorJob()创建的Job。传递一个SupervisorJob的目的是让你的CoroutineScope启动的协程可以彼此独立地失败,而不是任何一个单独的失败导致CoroutineScope中所有作业的取消。
没有太多的理由保留对SupervisorJob的引用并使用它来管理您的CoroutineScope。只需从您的CoroutineScope引用管理您的CoroutineScope即可。
创建自定义作用域而不是使用内置作用域(如lifecycleScopeviewModelScopeGlobalScope)的目的是,您希望控制一些协同程序的生命周期,而这些协同程序并不直接绑定到生命周期对象(Activity或片段)或ViewModel的生命周期。

eulz3vhy

eulz3vhy2#

Kotlin协同程序仍然是一个相对较新的功能,在2017-2019年经历了很大的发展。因此,网络上有很多内容涉及曾经是最佳实践的模式。但是现在已经过时了。创建自己的Job示例将其放入一个作用域就是一个很好的例子。在首次引入结构化并发和作用域时,Android库中还没有对它们的支持,因此这是最好的方法。
今天,这种方法只需要用于一些特殊的生命周期。
我还要指出,作用域不是你“启动”的东西,它只是一个简单的数据对象, Package 了CoroutineContext的一个示例,它的目的是使构建协程层次结构变得容易,因为它既是协程构建器函数的接收者,又在构建器体中绑定到this
此外,当您创建CoroutineScope而没有显式包含Job时,会自动向其中添加一个示例。

1cklez4t

1cklez4t3#

如果你想全局管理你的协程,你可以这样做:

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

相关问题