Kotlin异步编程:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 异步编程简介

现代应用程序需要高性能和快速响应。Kotlin 中的异步编程是一种强大的工具,它允许您编写非阻塞代码,高效利用系统资源。与传统多线程不同,Kotlin 协程提供了轻量级的执行线程,可以在不阻塞主线程的情况下暂停和恢复。

在本指南中,我们将详细解析 Kotlin 异步编程的关键概念:从基本的协程到使用 Flow 和 Channel 的高级模式。您将学会创建高效、运行快速且可靠的异步应用程序。



Kotlin 协程基础

什么是协程?

协程是一种轻量级的执行线程,可以在某个点暂停,在另一个点恢复。在 Kotlin 中,协程通过 suspend 关键字和特殊的构建器在语言层面实现。



启动第一个协程

要使用协程,您需要在 build.gradle.kts 中添加依赖:

dependencies {    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}

启动协程的基本示例:

import kotlinx.coroutines.*

fun main() = runBlocking { launch { delay(1000L) println("World!") } println("Hello,")}

执行结果:

Hello,World!


挂起函数

挂起函数是可以在不阻塞线程的情况下暂停协程执行的函数。它们使用 suspend 关键字标记:

suspend fun fetchUserData(): String {    delay(2000L) // 模拟网络请求    return "User data"}

fun main() = runBlocking { val data = fetchUserData() println(data)}


管理协程:作用域与调度器

CoroutineScope

CoroutineScope 定义了协程的生命周期。所有协程都在特定的作用域内启动。如果作用域被取消,其所有子协程也会被取消。

class MyViewModel : ViewModel() {    private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())        fun loadData() {        scope.launch {            val data = fetchData()            updateUI(data)        }    }        override fun onCleared() {        super.onCleared()        scope.cancel()    }}


调度器:选择执行线程

调度器决定了协程将在哪个线程池上执行。主要类型:

  • Dispatchers.Main — 用于 UI 线程(Android、JavaFX)
  • Dispatchers.IO — 用于输入/输出操作(网络、文件)
  • Dispatchers.Default — 用于 CPU 密集型任务
  • Dispatchers.Unconfined — 不绑定到特定线程
fun main() = runBlocking {    launch(Dispatchers.IO) {        println("Executing on IO: ${Thread.currentThread().name}")    }    launch(Dispatchers.Default) {        println("Executing on Default: ${Thread.currentThread().name}")    }}


进阶技巧:async/await 与协程取消

使用 async 进行并行执行

async 构建器允许您并行启动多个任务,并通过 await() 获取结果:

suspend fun fetchDataFromApi1(): String {    delay(1000L)    return "Result from API 1"}

suspend fun fetchDataFromApi2(): String { delay(1500L) return "Result from API 2"}

fun main() = runBlocking { val time = measureTimeMillis { val result1 = async { fetchDataFromApi1() } val

博客

书籍推荐