关于kotlin协程在App或者服务端的使用,想必接触过的人可能都清楚。无非就是用 async 或者 withContext 来实现异步协程来处理耗时任务。因此,我们也可以用协程来做一些并发任务。
例如 需求上可能需要我们用协程来 做一个 多线程上传文件的一个功能,要求其中任何一个任务失败,其他后续未完成或未开始的任务都终止掉,那么需要怎么做呢?其实并不复杂
首先,我们要认识有这样的一个东西
coroutineScope{
val job1=async{ //耗时操作 }
val job2=async{ //耗时操作 }
job1.await()
job2.await()
}
supervisorScope{
val job1=async{ //耗时操作 }
val job2=async{ //耗时操作 }
job1.await()
job2.await()
}
这是一段非常常见的,在挂起函数中会声明的代码,想必用过 suspend 的都接触过 coroutineScope 与 supervisorScope
这两者的作用都是
将内部包裹起来的协程与调用该挂起函数的协程作用域和生命周期相关联。
这句话什么意思呢?你可以这样理解。当我们这个最外层的协程用 launch 启动的时候,我们绑定了viewModel的 scope,当viewModel被销毁的同时,这些被关联的子协程都会被一并销毁。
那么 coroutineScope 跟 supervisorScope的区别是什么呢?
1.coroutineScope 如果他内部的子协程发生了异常或者被cancel,他会将这个东西告知给他下属所有的子协程,做相同cancel操作
2.supervisorScope 他不关心子协程有没有报错,都不会影响其他子协程
哦吼,看到这里,你是不是已经明白了?
没错,我们就是要利用coroutineScope 的这个特性。
只需要在内部起的子协程中,在合适的地方调用 cancel()方法,就可以实现并发协程,失败时自动取消所有未完成任务这样的一个功能,很简单吧?😁
具体的示例代码这里就没有必要在写了。我相信各位都明白应该怎么做了