Kotlin 异步编程:初学者完全指南
现代应用程序越来越需要同时执行多个任务:从网络加载数据、与数据库交互、处理用户输入。在 Kotlin 语言中,这是通过基于协程 (coroutines) 的异步编程实现的。这是一个强大而优雅的工具,允许您编写非阻塞代码,而无需复杂的回调。
在本文中,我们将介绍 Kotlin 中异步编程的基础知识:什么是协程,如何使用 launch、async 和 await,以及了解调度器和错误处理。本材料面向已经熟悉 Kotlin 基本语法的初学者开发者。
什么是协程以及为什么需要它们?
协程是一个轻量级的执行线程,可以在不阻塞主线程的情况下被挂起和恢复。与传统的线程不同,协程不绑定到系统资源,可以在一个线程中执行并在它们之间切换。
协程的主要优势:
- 轻量 — 可以启动数千个协程而不会显著消耗内存。
- 挂起 (suspend) — 函数可以“冻结”其执行,而不阻塞线程。
- 结构化并发 — 协程自动管理其生命周期。
- 简单性 — 代码看起来像同步代码,没有嵌套的回调。
要使用协程,需要在 build.gradle.kts 中添加依赖:
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}基本构建块:launch、async 和 suspend
suspend 函数
任何可以挂起协程执行的函数都用关键字 suspend 标记。这些函数只能在协程内部或其他 suspend 函数中调用。
suspend fun fetchUserData(): String { delay(1000) // 模拟延迟 return "User data loaded"}函数 delay() 类似于 Thread.sleep(),但不会阻塞线程。
launch — 启动不返回结果的协程
构建器 launch 启动一个新的协程,它不返回结果(返回 Job)。用于“启动并忘记”类型的任务。
import kotlinx.coroutines.*
fun main() = runBlocking { launch { println("协程 1 已启动") delay(1000) println("协程 1 已完成") } println("主线程继续工作")}输出:
主线程继续工作协程 1 已启动协程 1 已完成请注意:runBlocking 仅用于教学示例或入口点(例如在 main() 中)。在实际应用程序(Android、服务器)中不需要使用它。
async 和 await — 获取结果
如果协程需要返回结果,则使用构建器 async。它返回一个 Deferred<T> 对象,可以通过 await() 从中获取值。
fun main() = runBlocking { val deferredResult: Deferred<String> = async { delay(1500) "计算结果" }
println("等待结果...") val result = deferredResult.await() println("获取结果: $result")}输出:
等待结果...获取结果: 计算结果使用 async 可以启动多个并行任务:
博客
书籍推荐
推荐阅读