协程中的取消和异常(驻留任务)
2020-12-04 本文已影响0人
大虾啊啊啊
在之前我们知道可以使用jetpack中的lifecycleScope ,viewModelScope来将我们的作用域和生命周期绑定,这样以来,生命周期销毁的时候,取消我们的作用域。但是有时候,我们需要做一些缓存操作,即使Acivity被退出了,但是只要进程还在,我们希望做一些操作,不希望协程的作用域被取消。我们自定义CoroutineScope,不推荐使用(GloabalScope ,官方的意思是这样会导致我们的作用域不可控制),我们在Application定义我们的CoroutineScope,因为进程结束的时候,这样我们的作用域也会被结束
class MyApplication : Application() {
// 不需要取消这个作用域,因为它会随着进程结束而结束
val applicationScope = CoroutineScope(SupervisorJob() + otherConfig)
}
接着我们可以通过该作用域启动我们的协程执行缓存的一些任务
suspend fun doWork() {
withContext(ioDispatcher) {
doSomeOtherWork()
externalScope.launch {
//如果这里会抛出异常,那么要将其包裹进 try/catch 中;
//或者依赖 externalScope 的 CoroutineScope 中的 CoroutineExceptionHandler
veryImportantOperation()
}.join()
}
}
以上我们说的驻留任务前提是APP进程还在,如果APP进程结束了,我们希望在某个时间点做某些操作,我们可以使用jetpack中的WorkManager.