Android 之 Kotlin中的协程(Dispatchers.IO)
Kotlin 协程是一种轻量级的并发编程框架,用于简化异步操作和并发任务管理。它通过挂起(suspend)而非阻塞线程的方式实现异步操作,显著提升代码可读性和资源利用率。以下是其核心要点:
一、核心概念与优势
轻量级线程
- 内存占用低:一个协程仅需几十字节内存,而线程需 MB 级内存。
- 高并发能力:单线程可运行数万个协程,避免线程资源耗尽问题。
- 协作式调度:协程主动让出执行权,而非线程的抢占式调度,减少上下文切换开销。
结构化并发(Structured Concurrency)
- 父协程的生命周期控制所有子协程,取消父协程会自动取消子协程。
- 避免协程泄漏,确保资源自动释放。
挂起函数(Suspend Functions)
- 使用
suspend
关键字标记,可在不阻塞线程的情况下暂停和恢复执行。 - 底层通过 CPS(Continuation Passing Style)转换实现状态机机制
- 使用
二、关键组件详解
协程作用域(CoroutineScope)
- 管理生命周期:作用域取消时,内部所有协程自动取消。
- 常用作用域:
GlobalScope
:全局作用域(慎用,易内存泄漏)。viewModelScope
/lifecycleScope
:在 Android 中绑定 ViewModel 或生命周期
2.调度器(Dispatchers)
调度器类型 | 用途 | 线程策略 |
---|---|---|
Dispatchers.IO | I/O 密集型(网络、文件) | 共享线程池(最多64线程) |
Dispatchers.Default | CPU 密集型计算 | 线程数 = CPU 核心数 |
Dispatchers.Main | Android 主线程更新 UI | 主线程 |
Dispatchers.Unconfined | 不限定线程 | 挂起后可能切换线程 |
协程构建器
launch
:启动不返回结果的协程,返回Job
对象。async
:启动返回Deferred<T>
的协程,通过await()
获取结果
// 并发执行两个任务
val user = async { fetchUser() }
val posts = async { fetchPosts() }
showResult(user.await(), posts.await())
三、典型应用场景
网络请求封装
结合 Retrofit 的suspend
函数,避免回调嵌套:
viewModelScope.launch {try {val data = withContext(Dispatchers.IO) { api.fetchData() }_uiState.value = Success(data)} catch (e: Exception) {_uiState.value = Error(e)}
}
数据库操作(Room)
DAO 层直接支持 suspend
函数:
@Dao
interface UserDao {@Query("SELECT * FROM user")suspend fun getAll(): List<User>
}
CoroutineScope(Dispatchers.IO).launch {// 后台任务代码(如网络请求、数据库操作)
}
-
CoroutineScope(Dispatchers.IO)
- 创建一个新的协程作用域(Coroutine Scope),并指定调度器为
Dispatchers.IO
。 Dispatchers.IO
:专为 I/O 密集型任务(如网络请求、文件读写、数据库操作)优化,使用共享的线程池(默认最多 64 线程)。
- 创建一个新的协程作用域(Coroutine Scope),并指定调度器为
-
.launch { ... }
- 启动一个不需要返回结果的后台协程(
Job
类型)。 - 协程内部的代码会在
Dispatchers.IO
线程池中执行,避免阻塞主线程
- 启动一个不需要返回结果的后台协程(
CoroutineScope
的作用
- 生命周期管理:通过
CoroutineScope
创建的协程会绑定到该作用域,调用scope.cancel()
可取消所有子协程,避免内存泄漏。 - 替代方案(更推荐):
-
lifecycleScope
:在 Android 中绑定Activity/Fragment
生命周期,销毁时自动取消协程。 -
viewModelScope
:绑定ViewModel
生命周期,适合 MVVM 架构
-
总结
- 核心价值:协程以同步代码风格解决异步问题,消除回调地狱,提升可维护性
。 - 适用场景:网络请求、数据库操作、并发任务、数据流处理等异步场景。
- 趋势:在 Android 开发中已成为替代
AsyncTask
、RxJava
的主流方案,官方库(Retrofit、Room)全面支持