Kotlin 面试题
目录

Kotlin 中如何取消协程?

· 约 3 分钟读完 · 第 134 / 200 章

推荐答案

在 Kotlin 中,取消协程可以通过调用 Job 的 cancel() 方法来实现。协程的 Job 对象可以通过 launch 或 async 函数返回。以下是一个简单的示例:

在这个示例中,job.cancel() 会取消协程的执行,job.join() 会等待协程完全结束。

本题详细解读

1. 协程的取消机制

Kotlin 协程的取消是协作式的,这意味着协程需要主动检查取消状态并做出响应。协程可以通过 isActive 属性来检查是否被取消,或者在挂起函数(如 delay)中自动响应取消。

2. cancel() 方法

cancel() 方法用于取消协程的执行。调用 cancel() 后,协程会进入取消状态,但协程并不会立即停止执行,而是会在下一个挂起点或检查取消状态时停止。

3. join() 方法

join() 方法用于等待协程的完成。即使协程被取消,join() 也会等待协程完全结束。这确保了在协程完全停止之前,主线程不会继续执行。

4. 取消的传播

如果协程内部启动了其他协程,取消操作会传播到所有子协程。这意味着父协程的取消会导致所有子协程也被取消。

5. 处理取消异常

在协程被取消时,会抛出 CancellationException 异常。通常情况下,这个异常不需要显式处理,因为它用于协程的正常取消流程。

6. 不可取消的代码块

如果需要在协程中执行不可取消的代码块,可以使用 withContext(NonCancellable) 来包裹代码。这样即使协程被取消,代码块中的操作也会继续执行。

在这个示例中,finally 块中的代码使用了 NonCancellable 上下文,确保即使协程被取消,finally 块中的代码也会执行。