Kotlin 面试题
目录

Kotlin 中 launch 和 async 的区别是什么?

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

推荐答案

在 Kotlin 协程中,launch 和 async 是两种常用的协程构建器,它们的主要区别在于返回值和处理方式:

  • launch:用于启动一个不需要返回结果的协程。它返回一个 Job 对象,可以通过该对象来控制协程的生命周期(如取消协程)。launch 通常用于执行一些不需要返回值的后台任务。

  • async:用于启动一个需要返回结果的协程。它返回一个 Deferred 对象,该对象是 Job 的子类,可以通过调用 await() 方法来获取协程的执行结果。async 通常用于并发执行多个任务并等待它们的结果。

本题详细解读

launch 的使用场景

launch 适用于那些不需要返回结果的任务,例如后台任务、日志记录、UI 更新等。由于它不返回结果,因此通常用于执行一些“即发即忘”的操作。

async 的使用场景

async 适用于那些需要返回结果的任务,例如并发执行多个网络请求并等待所有请求完成后再进行下一步操作。async 返回的 Deferred 对象可以通过 await() 方法来获取协程的执行结果。

异常处理

  • launch:如果在 launch 块中发生异常,协程会立即取消,并且异常会传播到父协程或协程作用域。
  • async:如果在 async 块中发生异常,异常不会立即传播,只有在调用 await() 时才会抛出异常。

并发执行

async 通常用于并发执行多个任务,而 launch 则用于执行单个任务。例如,可以使用 async 来并发执行多个网络请求:

总结

  • launch 用于不需要返回结果的任务,返回 Job 对象。
  • async 用于需要返回结果的任务,返回 Deferred 对象,并通过 await() 获取结果。
  • launch 的异常会立即传播,而 async 的异常在调用 await() 时才会抛出。