coroutineScope和supervisorScope的区别

1. 区别

coroutineScopesupervisorScope都是用来创建一个 CoroutineScope并执行代码块,创建的 CoroutineScope将继承上一级 CoroutineScopeCoroutineScope.coroutineContext,但是会重写 croutineContextJob

它们的区别在于 coroutineScopecoroutine 是一个 ScopeCoroutine,而 supervisorScopecoroutine是一个 SupervisorCoroutineSupervisorCoroutine继承自 ScopeCoroutine但是重写了其父类 JobSupport的方法 childCancelled(cause: Throwable): Boolean并返回 false。这就是它们之间的唯一区别。

这一区别导致:

  • coroutineScope中,只要任意一个子协程发生异常,整个 scope都会执行失败,并且其余的所有子协程都会被取消掉;
  • supervisorScope中,一个子协程的异常不会影响整个 scope的执行,也不会影响其余子协程的执行;

这两种 CoroutineScope创建方式的区别只在于当发生异常时,它们对异常的处理方式各不相同。

我们接下来用例子详细说明它们各自如何处理异常。


2. 举例说明

若想统一处理协程的异常,防止异常引发程序崩溃,可以给协程设置 CoroutineExceptionHandler,我们先定义一个协程异常处理器,如下,简单地把异常信息打印出来:

private val exceptionHandler = CoroutineExceptionHandler{
    _, e ->    
    e.message?.let {
    Log.e("crx", "异常信息: $it") }
} 

我们在 Activity

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值