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

在之前我们知道可以使用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.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容