在 Android MVVM(Model-View-ViewModel)架构中,以下核心概念和组件至关重要:
1. Model(模型)
-
职责:负责数据逻辑(如网络请求、数据库操作、文件读写等)。
-
特点:
- 独立于 UI,不感知 View 或 ViewModel。
- 通常通过 Repository 模式封装数据源(本地/远程)。
2. View(视图)
-
职责:处理 UI 渲染和用户交互(Activity/Fragment/Composable)。
-
特点:
- 被动更新 :通过观察 ViewModel 的数据变化(如
LiveData
/Flow
)自动刷新。 - 最小逻辑:仅处理 UI 操作,业务逻辑委托给 ViewModel。
- 被动更新 :通过观察 ViewModel 的数据变化(如
3. ViewModel(视图模型)
-
职责:为 View 提供数据并处理业务逻辑,充当 Model 和 View 的桥梁。
-
特点:
- 生命周期感知 :通过
ViewModel
类保留配置变更(如屏幕旋转)时的数据。 - 暴露数据 :通过
LiveData
、StateFlow
等可观察对象通知 View。 - 无 UI 引用:避免内存泄漏,不直接持有 View 的上下文。
- 生命周期感知 :通过
4. 数据绑定(Data Binding)
-
作用:将 View 与 ViewModel 的数据直接绑定(减少样板代码)。
-
实现:
- 在 XML 中使用
@{}
语法绑定变量。 - 结合
LiveData
或ObservableField
实现双向绑定。
- 在 XML 中使用
5. LiveData / StateFlow
-
LiveData:
- 生命周期感知的可观察数据持有者。
- 通常用于 View 监听 ViewModel 的数据变化。
-
StateFlow:
- Kotlin 协程中的响应式流,更适合复杂异步场景。
- 需要配合
LifecycleScope
或repeatOnLifecycle
避免泄漏。
6. Repository(仓库)
-
职责:集中管理数据来源(如 API、数据库、缓存)。
-
特点:
- 对 ViewModel 提供统一的数据接口。
- 处理数据协调(如先读缓存再请求网络)。
7. 依赖注入(DI)
-
作用:解耦组件依赖(如 ViewModel 依赖 Repository)。
-
常用工具:
- Hilt(官方推荐):基于 Dagger 的简化库。
- Koin:纯 Kotlin 的轻量级 DI 框架。
8. ViewModelScope / Coroutines
-
ViewModelScope:
- ViewModel 自带的协程作用域,自动取消避免泄漏。
-
用途:在 ViewModel 中执行异步任务(如调用 Repository)。
9. 单向数据流(UDF)
-
原则:数据从 Model → ViewModel → View 单向流动。
-
优势:状态可预测,易于调试。
-
实现:
- View 触发事件 → ViewModel 处理 → 更新 Model → 返回新状态给 View。
10. 事件处理
-
挑战:如何处理一次性事件(如 Toast、导航)?
-
解决方案:
- SingleLiveEvent (已废弃):替代方案如
SharedFlow
+replay=0
。 - 事件密封类:区分状态和事件。
- SingleLiveEvent (已废弃):替代方案如
11. 测试策略
- ViewModel:隔离测试业务逻辑(Mock Repository)。
- Repository:测试数据源整合。
- UI 测试:使用 Espresso 或 Compose 测试框架。
12. Jetpack 组件整合
- Room:数据库操作(与 LiveData/Flow 无缝集成)。
- Navigation:结合 ViewModel 共享导航相关数据。
- WorkManager:后台任务与 ViewModel 协作。
关键优势
- 关注点分离:UI、业务、数据逻辑解耦。
- 生命周期安全:减少内存泄漏风险。
- 可测试性:各组件可独立测试。
通过合理运用这些概念,可以构建可维护、可扩展的 Android 应用。