编程语言
首页 > 编程语言> > android – Kotlin并行协同程序

android – Kotlin并行协同程序

作者:互联网

从单独的协同程序保存多个作业实例是否可以接受.假设我想要同时运行几个协同程序,它们是无关的,不能在一个协同程序中发生,但我希望它们并行运行.在Android中我应该保存作业实例,以便我可以在onDestroy方法中取消作业.将每个工作单独保存在列表中还是打破某种规则是可以接受的.我知道在RX他们有订阅为什么在Kotlin Coroutines中没有相同的东西?

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)
}

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

解决方法:

您可以手动保留您启动的Job对象列表,但您也可以使用现成的父子Job Hierarhy来管理和保持已启动作业的列表更容易.

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

val job = Job()

然后,每当你找到一个新的协程时,你就会成为这个工作的孩子:

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

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

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

override fun onDestroy() {
    super.onDestroy()
    job.cancel()
}

这个apporoach的优点是自动管理作业列表.可以启动新的协同程序并将其添加到父作业中,当它们完成时,它们会自动从父作业中删除它们.

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

标签:android,kotlin,kotlin-coroutines
来源: https://codeday.me/bug/20190527/1162996.html