Android kotlin 协程的详细使用指南
Android Kotlin 协程的详细使用指南,结合核心概念、实战场景和最佳实践:
一、协程基础概念
-
协程本质
协程是轻量级线程,通过挂起/恢复机制实现并发,相比线程节省90%以上的内存开销。其核心优势在于结构化并发和挂起函数的协作式调度。 -
关键组件
- CoroutineScope:生命周期绑定的作用域(如
viewModelScope
) - Dispatcher:调度器(IO/Default/Main/Unconfined)
- Job:控制协程任务的生命周期
- 挂起函数:用
suspend
标记的可暂停函数
- CoroutineScope:生命周期绑定的作用域(如
二、基础使用场景
1. 网络请求封装
viewModelScope.launch(Dispatchers.IO) {
try {
val data = repository.fetchData() // suspend函数
withContext(Dispatchers.Main) {
updateUI(data)
}
} catch (e: Exception) {
handleError(e)
}
}
要点:
- 使用
viewModelScope
自动取消避免内存泄漏 - IO线程执行网络请求,Main线程更新UI34
2. 并发任务组合
val userData = async { getUser() }
val newsFeed = async { getFeed() }
showContent(userData.await(), newsFeed.await())
通过async/await
实现并行请求
三、高级特性
1. 结构化并发
coroutineScope {
launch { task1() }
launch { task2() } // 任一子协程失败会取消整个作用域
}
优势:自动传播取消操作和异常
2. 异常处理
supervisorScope {
val child1 = launch { /* 失败不影响其他子协程 */ }
val child2 = launch(CoroutineExceptionHandler { _, e -> log(e) }) {
/* 单独处理异常 */
}
}
注意:
SupervisorJob
隔离子协程异常- 全局异常处理器需配合使用
四、性能优化技巧
-
调度器选择
- CPU密集型:
Dispatchers.Default
- 文件/数据库:
Dispatchers.IO
(支持64线程并行) - 主线程操作:
Dispatchers.Main.immediate
- CPU密集型:
-
避免阻塞
使用withTimeout
限制耗时操作:withTimeout(3000) { fetchFromNetwork() // 超时自动取消 }
五、常见问题解决方案
-
内存泄漏
使用lifecycleScope
或viewModelScope
自动绑定生命周期3 -
线程阻塞
将阻塞调用(如Room操作)包装为suspend
函数:suspend fun queryDb() = withContext(Dispatchers.IO) { db.query() }
通过合理使用协程的挂起机制、结构化并发和调度策略,可以显著提升Android应用的响应速度和资源利用率。