Android项目使用协程必须同时引入kotlinx-coroutines-core和kotlinx-coroutines-android两个1.8.0版本依赖,缺一不可;仅加core会导致Dispatchers.Main不可用、lifecycleScope无法识别,常见错误为Unresolved reference: Main或Cannot access 'lifecycleScope'。

直接在 build.gradle.kts 里加 implementation 依赖就行
当前最新稳定版是 1.8.0(2026年3月发布),Android 项目必须同时引入 core + android 两个模块,缺一不可。只加 kotlinx-coroutines-core 会导致 Dispatchers.Main 不可用、lifecycleScope 等 Android 扩展无法识别。
常见错误现象:Unresolved reference: Main 或 Cannot access 'lifecycleScope': it is internal in 'androidx.lifecycle',基本都是漏了 kotlinx-coroutines-android。
-
build.gradle.kts(模块级)中写:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0")
}
注意:不需要手动添加 mavenCentral(),现代 Android Gradle Plugin(8.0+)默认已配置。
用 buildSrc 统一管理协程版本更安全
多模块项目里如果每个 build.gradle.kts 都硬编码版本号,很容易出现 core 和 android 版本不一致——比如一个模块用 1.8.0,另一个用 1.7.3,编译可能通过,但运行时 JobCancellationException 行为异常或 withContext(Dispatchers.IO) 意外阻塞主线程。
推荐做法:在根目录建 buildSrc,定义统一版本常量:
// buildSrc/src/main/kotlin/Dependencies.kt
object Versions {
const val coroutines = "1.8.0"
}
object Libs {
const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}"
const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutines}"
}
然后各模块只需写:
dependencies {
implementation(Libs.coroutinesCore)
implementation(Libs.coroutinesAndroid)
}
别碰 settings.gradle.kts 里的 pluginManagement 依赖
有人误把协程依赖加到 settings.gradle.kts 的 pluginManagement { repositories { ... } } 块里,这是错的。那个块只管 Gradle 插件本身的下载源,不是项目依赖的配置位置。
典型错误写法:
pluginManagement {
repositories {
mavenCentral()
}
plugins {
// ❌ 这里不能声明 kotlinx-coroutines 依赖
id("org.jetbrains.kotlinx:kotlinx-coroutines-android") version "1.8.0"
}
}
后果:Gradle 同步失败,报 Plugin [id: 'org.jetbrains.kotlinx:kotlinx-coroutines-android'] was not found ——因为这不是插件,是普通库。
runBlocking 是调试用的,别往 Android UI 层里塞
刚学协程的人容易在 Activity 或 Fragment 里直接写 runBlocking 调用挂起函数,比如:
fun onCreate(...) {
runBlocking {
val data = api.getData() // ❌ 主线程被完全阻塞
}
}
这会卡死 UI,触发 ANR。Android 上正确的入口是作用域 + launch:
- Activity/Fragment 用
lifecycleScope.launch - ViewModel 用
viewModelScope.launch - 纯工具类或测试用
runBlocking(仅限单元测试或脚本调试)
真正容易被忽略的一点:协程不是“加了依赖就能用”,它依赖整个结构化并发模型。漏掉作用域绑定、忘记取消、在非 suspend 函数里调用 suspend 函数——这些都不会在编译时报错,但会在运行时静默失败或内存泄漏。动手前先确认你用的是哪个作用域,以及它是否随组件生命周期自动取消。


















