viewModelScope 和调度器
在正确的线程上运行任务
viewModelScope 和调度器 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
感知生命周期的作用域
Android 提供了会自动取消的内置作用域:
viewModelScope— ViewModel 被清除时取消。lifecycleScope— 与 Activity/Fragment 的生命周期绑定。
使用 viewModelScope
在 viewModelScope 中启动数据处理工作。当 ViewModel 被清除时,协程会自动为您取消,无需手动清理。
class UserViewModel(
private val repo: UserRepository
) : ViewModel() {
fun load() {
viewModelScope.launch {
val users = repo.getUsers()
_uiState.value = UiState(users)
}
}
}为什么不使用 GlobalScope
请避免使用 GlobalScope:其中的协程会在整个应用运行期间存在,且从不与生命周期绑定,这会导致泄漏,并让工作在屏幕离开后仍继续执行。
什么是调度器?
调度器决定协程在哪个线程(或线程池)上运行。选择合适的调度器可以让主线程保持空闲。
标准调度器
Dispatchers.Main— 界面线程。Dispatchers.IO— 用于网络和磁盘输入输出。Dispatchers.Default— 用于 CPU 密集型工作。
viewModelScope 默认使用 Main
viewModelScope 会在 Dispatchers.Main 上启动。更新状态时这样做没有问题,但应将繁重的工作移出该线程。
使用 withContext 切换
使用 withContext 在其他调度器上运行代码块,完成后再返回调用方。
suspend fun loadFile(): String =
withContext(Dispatchers.IO) {
File("data.txt").readText()
}主线程安全的函数
如果一个函数内部会进行线程切换,因此可以安全地从主线程调用,那么它就是主线程安全的。代码仓库应当是主线程安全的,让调用方无需担心线程问题。
class Repo {
suspend fun getUsers() =
withContext(Dispatchers.IO) { dao.getAll() }
}Room 和 Retrofit 都是主线程安全的
好消息:Room 的 suspend DAO 方法和 Retrofit 的 suspend 调用已经会在主线程之外运行。通常无需为它们显式使用 withContext。
在 Default 上执行 CPU 工作
对于排序超大列表或解析等繁重计算,请使用 Dispatchers.Default,以避免界面卡顿。
val sorted = withContext(Dispatchers.Default) {
bigList.sortedBy { it.score }
}注入调度器
为了便于测试,请注入调度器,而不是将其硬编码。这样测试时就可以替换为测试调度器。
class Repo(
private val io: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun load() = withContext(io) { /* ... */ }
}快速检查
测试您对作用域和调度器的理解。
回顾
您学会了:
viewModelScope会在 ViewModel 被清除时取消协程。- 避免使用
GlobalScope。 - 选择调度器:Main(界面)、IO(网络/磁盘)、Default(CPU)。
withContext用于切换线程;应尽量编写主线程安全的函数。
常见问题解答
「viewModelScope 和调度器」课时是免费的吗?
是的 — 「viewModelScope 和调度器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「viewModelScope 和调度器」这节课中我会学到什么?
在正确的线程上运行任务 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「viewModelScope 和调度器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 协程基础和作用域
- viewModelScope 和调度器
- Kotlin Flow 基础
- StateFlow 和 SharedFlow