Kotlin 并行协程

Big*_*hat 4 android kotlin kotlin-coroutines

从单独的协程中保存多个作业实例是否可以接受。假设我想一次运行几个协程,其中它们不相关并且不能在一个协程中发生,但我希望它们并行运行。在 Android 中,我应该保存作业实例,以便我可以在 onDestroy 方法中取消作业。将每个工作单独保存在列表中是否可以接受,或者我是否违反了某种规则。我知道在 RX 中他们有订阅,为什么 Kotlin 协程中没有等效的?

val jobList = arrayListOf<Job>()

fun startJob1() {
    jobList.add(launch {
        //do some work
    })

fun startJob1() {
    jobList.add(launch {
        //do some other unrelated work
    })

override fun onDestroy() {
    super.onDestroy()
    cancelAllActiveJobs(jobList)
}
Run Code Online (Sandbox Code Playgroud)

这种类型的架构对协程有意义吗?

Rom*_*rov 5

您可以手动保存Job您启动的对象列表,但您也可以使用开箱即用的父子作业层次结构来更轻松地管理和保持启动的作业列表。

因此,首先,您定义对父作业的引用,而不是作业列表:

val job = Job()
Run Code Online (Sandbox Code Playgroud)

然后,每次你启动一个新的协程时,你都会让它成为这项工作的项:

fun startJob1() {
    launch(job) { // make it a child
        //do some work
    }
}

fun startJob1() {
    launch(job) { // make it a child
        //do some other unrelated work
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,当您需要销毁对象并取消所有作业时,您只需取消父作业。

override fun onDestroy() {
    super.onDestroy()
    job.cancel()
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是作业列表是自动管理的。新的协程可以启动并添加到父作业中,当它们完成时,它们会自动从父作业中删除自己。

您可以在指南的相应部分阅读更多内容:https : //github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#cancellation-via-explicit-job