kotlin协程取消执行

张开发
2026/4/9 4:24:21 15 分钟阅读

分享文章

kotlin协程取消执行
取消启动协程的整个scope该scope下面的所有协程都会被取消。协程内部是通过抛出一个特殊的异常来实现取消的CancellationException。如果想在取消时传递取消的原因可以在调用cancel时主动提供一个CancellationException的实例fun cancel(cause: CancellationException? null)在协程内部子协程通过异常来通知其父协程自己已经取消了。父协程判断抛出来的异常如果是CancellationException就不需要采取其他行动。如果不是可能会引起app崩溃。如果只是调用协程的cancel协程会进入Cancelling状态协程会被置为取消状态但并不意味着协程的执行就会立刻停止只有在工作完成后协程才会进入Cancelled状态。如果没有在协程代码块中进行cancel的感知并主动结束止协程代码块的执行那么它就会继续执行直到协程里面的工作全部做完。协程作用域 CoroutineScope如果使用androidx KTX库那么可以不用创建自己的scope也不需要手动去取消它们。在ViewModel中使用viewModelScope使用lifecycleScope启动与生命周期作用域绑定的协程。viewModelScope和lifecycleScope都是CoroutineScope对象viewModelScope会在ViewModel的clear()时会被取消lifecycleScope会在DESTROYED时取消。检查协程取消状态所有kotlinx.coroutines的suspend函数都是可取消的使用其中的任何一个suspend函数不需要检查取消状态然后停止执行或抛出CancellationException。如果不是用的kotlinx.coroutines的suspend函数那么需要检查协程取消状态。有2个方案检查协程取消状态检查job.isActive状态或ensureActive()。用isActive可以感知状态而调用ensureActive()则是在内部判断到已取消时抛出CancellationException。调用yield()。yield函数检查取消yield函数的作用申请出让线程的执行权给其他协程提供被执行机会。检查所在协程的状态如果已经取消则抛出取消异常予以响应。如果协程没有取消且无须出让执行权则继承执行。协程yield与线程yield的区别线程yield调用时会同样提示线程的调度器当前线程任务可以出让自己的执行权。在出让调度权方面 线程和协程的yield的设计思路基本一致。线程的yield不会抛出中断异常不会检查线程的中断状态这是线程的yield与协程的yield之间一个较大的差异。withTimeout超时取消withTimeoutOrNull它的效果是在超时的情况下返回null。newSingleThreadContext函数newSingleThreadContext函数是kotlinx.coroutines库中提供的用来创建一个单线程调度器该调度器创建一个‌专用线程‌用于需要‌独占线程‌的场景。禁止取消官方框架为提供了一个名为NonCancellable的上下文实现 它的作用就是禁止作用域范围内的协程被取消。NonCancellable需要与withContext配合使用不 应当作为launch这样的协程构造器的上下文传入。

更多文章