0Pricing
Android Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 协程基础和作用域
  2. viewModelScope 和调度器
  3. Kotlin Flow 基础
  4. StateFlow 和 SharedFlow
← 返回 Android Academy