为什么使用 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 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么使用 ViewModel
- 从 ViewModel 暴露状态
- Android 生命周期
- collectAsStateWithLifecycle