0Pricing
Android Academy · 课时

为什么使用 ViewModel

妥善应对配置变化

为什么使用 ViewModel 是 CoddyKit 上的免费 Android Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

什么是 ViewModel

ViewModel 是 Android 架构组件,专门用于以符合生命周期的方式存储和管理与 UI 相关的数据。

它可以在配置变更(例如屏幕旋转)期间继续存在,因此系统每次重建 UI 时,您的数据不会被销毁并重新创建。

配置变更问题

旋转设备时,Android 会销毁并重新创建 Activity。存储在 Activity 或 Composable 中的任何状态都会丢失。

  • 计数器会重置为零。
  • 已加载的列表会消失。
  • 网络请求可能会重新开始。

ViewModel 通过存在于 Activity 实例生命周期之外来解决这个问题。

ViewModel 如何保持存在

框架会在重建期间让同一个 ViewModel 实例继续存在。创建新的 Activity 时,系统会将现有的 ViewModel 交给它,而不是创建一个新的实例。

class CounterViewModel : ViewModel() {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

在 Compose 中获取 ViewModel

在 Jetpack Compose 中,您通常使用 viewModel() 辅助函数获取 ViewModel。对于同一个生命周期所有者,它会返回相同的实例。

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun CounterScreen(
    vm: CounterViewModel = viewModel()
) {
    Text("Count: " + vm.count)
}

关注点分离

ViewModel 有助于实现清晰的分工:

  • UI 层(Composable/Activity)只负责渲染状态和转发事件。
  • ViewModel 负责保存状态和业务逻辑。

这样可以让 UI 更轻量,也让逻辑更容易测试。

ViewModel 的作用域和所有权

ViewModel 的作用域属于 ViewModelStoreOwner,通常是 Activity、Fragment 或导航返回栈条目。

当该所有者被永久销毁时,ViewModel 会自动清除,例如用户按返回键结束 Activity 时。

onCleared 回调

ViewModel 最终销毁时,框架会调用 onCleared()。您可以利用它释放已打开的资源。

class MyViewModel : ViewModel() {
    override fun onCleared() {
        super.onCleared()
        // cancel jobs, close listeners
    }
}

ViewModel 中不应放置的内容

切勿在 ViewModel 中持有 View、Activity 或任何与 UI 绑定的 Context 的引用。由于 ViewModel 的生命周期长于 Activity,这样做会导致内存泄漏。

如果需要应用程序 Context,请改用 AndroidViewModel。

使用 AndroidViewModel 获取应用程序 Context

确实需要 Context 时,请扩展 AndroidViewModel,它可以安全地提供生命周期较长的应用程序 Context。

class PrefsViewModel(
    app: Application
) : AndroidViewModel(app) {
    private val context = getApplication<Application>()
}

传递构造函数参数

要将依赖项(例如仓库)注入 ViewModel,请使用 ViewModelFactory 或 Hilt 等 DI 框架。我们将在本学习路线的后续内容中讲解 Hilt。

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    // repo provided via a factory or Hilt
}

ViewModel 为何重要

ViewModel 是现代 Android 架构的基石。它可以为您提供:

  • 在配置变更期间保持存在。
  • 清晰分离 UI 与逻辑。
  • 可预测且可测试的状态管理。

快速检查

测试您对使用 ViewModel 原因的理解。

回顾

您已经学会:

  • ViewModel 会存储 UI 状态,并在配置变更期间继续存在。
  • 为避免内存泄漏,它绝不能持有 View 或 Activity 的引用。
  • 它属于某个所有者的作用域,并通过 onCleared() 清除。
  • AndroidViewModel 会提供安全的应用程序 Context。

常见问题解答

「为什么使用 ViewModel」课时是免费的吗?

是的 — 「为什么使用 ViewModel」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「为什么使用 ViewModel」这节课中我会学到什么?

妥善应对配置变化 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「为什么使用 ViewModel」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用 ViewModel
  2. 从 ViewModel 暴露状态
  3. Android 生命周期
  4. collectAsStateWithLifecycle
← 返回 Android Academy