协程中的取消和异常(驻留任务)

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.

上一篇下一篇

猜你喜欢

热点阅读