尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Android MVVM 架构模式实战指南:ViewModel、LiveData 与 StateFlow 在 developer-roadmap 中的系统解读
文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载MVVMModel-View-ViewModel是 Google 官方推荐的 Android 应用架构模式它将 UI 层View与业务逻辑和状态层ViewModel彻底分离让界面通过观察者模式对状态做出响应式渲染。本文以本仓库 Android 学习路线图中的 MVVM 文档为核心结合同路线图中 ViewModel 状态、LiveData、Flow/StateFlow、协程、Repository 与 Hilt 等关联主题系统梳理 MVVM 的核心概念、分层职责、状态管理与最佳实践帮助读者掌握一套可直接落地的响应式 UI 架构方案。一、MVVM 是什么三层分离的架构哲学MVVMModel-View-ViewModel是一种软件架构模式核心目标是将 UI 层View与业务逻辑和状态层ViewModel分离。正如 MVVM 文档 所定义的ViewModel 负责暴露状态与事件View 负责观察并响应式地渲染这些状态。---------- 观察/订阅 ------------- 调用/依赖 ------- | View | --------------------- | ViewModel | --------------------- | Model | | (UI层) | --------------------- | (状态/逻辑) | --------------------- | 数据层 | ---------- 状态回调/事件 ------------- 数据流向/仓库 -------这一模式的三大核心职责是View视图层只负责渲染 UI 和分发用户交互事件不持有业务逻辑ViewModel视图模型持有界面状态封装业务逻辑与状态转换逻辑与生命周期解耦Model模型层负责数据来源包括网络、数据库、本地缓存等。从 架构与设计模式文档 可以看到Android 生态中还存在 MVC、MVP、MVI 等多种架构各自定义了数据、逻辑与 UI 三层之间的交互方式。其中Google 推荐的 Android Architecture Components 正是遵循 MVVM 模式的原则构建的这也是 MVVM 成为 Android 主流架构的根本原因。该文档同时提醒架构不是放之四海皆准的刚性结构而是可依据项目实际灵活调整的指南。MVVM 与 MVP 的演进关系MVP 文档 指出MVP 中的 Presenter 作为 View 与 Model 之间的中介View 将用户操作委托给 PresenterPresenter 处理后再通过接口契约更新 View。MVP 在 MVVM 与 ViewModel 成为推荐方案之前被广泛使用。两者最大的差异在于MVP 中 Presenter 与 View 通过接口强耦合、需要手动同步而 MVVM 中 View 与 ViewModel 之间是观察者式的松耦合关系View 无需持有 ViewModel 的引用即可获得状态更新。二、Google 官方支持ViewModel、LiveData 与 StateFlowMVVM 文档 明确指出Google 为 MVVM 提供了官方支持核心组件包括ViewModel、LiveData 和 StateFlow。这三个组件各自解决 MVVM 落地中的关键问题组件定位核心能力ViewModel状态容器跨配置变更如屏幕旋转持久保存 UI 数据避免重复拉取与重建LiveData可观察数据持有者生命周期感知仅在组件处于活跃状态时推送更新StateFlow状态流基于协程 Flow 的状态持有者天然支持背压与流式变换ViewModel状态的跨配置变更持久化ViewModel 状态文档 对 ViewModel 的核心价值做了精准描述ViewModel 持有的数据能够在配置变更如屏幕旋转时保持不变UI 数据得以存活避免每次 Activity 或 Fragment 重建时都要重新获取或创建数据。UI 通过观察状态实现自动更新从而保证一致的用户体验。这与 状态变更文档 描述的 Activity 生命周期问题直接相关按 Home 键、旋转设备、接听电话等用户操作或系统事件都会触发生命周期状态切换开发者必须在此过程中保存和恢复 UI 状态以防止数据丢失——ViewModel 正是解决这一问题的官方方案。一个典型的 ViewModel 定义如下class NewsViewModel : ViewModel() { // 使用 MutableStateFlow 持有状态 private val _uiState MutableStateFlow(NewsUiState()) val uiState: StateFlowNewsUiState _uiState.asStateFlow() fun refresh() { // 业务逻辑从 Repository 拉取数据并更新状态 } }LiveData生命周期感知的可观察数据LiveData 文档 指出LiveData 是 Android Jetpack 中的生命周期感知可观察数据持有者它只在观察者处于活跃生命周期状态时才推送更新从而避免向已停止的组件发送更新导致崩溃。LiveData 常被用来将 ViewModel 状态暴露给 UI 层。class NewsViewModel : ViewModel() { private val _news MutableLiveDataListNewsItem() val news: LiveDataListNewsItem _news fun loadNews() { // 更新 LiveDataUI 自动感知并刷新 _news.value repository.fetchNews() } }在 View 层中LiveData 的观察是生命周期感知的// Activity / Fragment 中 viewModel.news.observe(this) { newsList - adapter.submitList(newList) }StateFlow协程时代的响应式状态流Flow 文档 说明Flow 是 Kotlin 协程库的一部分能够顺序发射多个值非常适合处理数据流或非瞬时的持续事件。Flow 基于观察者模式同时内置背压处理能力支持在流序列上进行转换、过滤、合并等操作。与协程结合后Flow 避免了回调地狱问题带来更可预测、更简化的并发设计。StateFlow 是 Flow 家族中专门用于状态持有的一员它始终保持一个当前值新订阅者会立即收到最新状态非常适合作为 ViewModel 向 UI 暴露状态的载体也是 Google 推荐替代 LiveData 的现代方案。// ViewModel 中使用 StateFlow 暴露 UI 状态 class NewsViewModel( private val repository: NewsRepository ) : ViewModel() { private val _uiState MutableStateFlow(NewsUiState()) val uiState: StateFlowNewsUiState _uiState.asStateFlow() init { viewModelScope.launch { repository.newsFlow() .collect { items - _uiState.value NewsUiState(items) } } } }协程MVVM 异步逻辑的基础设施协程文档 指出Kotlin 协程允许以顺序、可读的方式编写异步代码它们轻量、支持结构化并发并通过生命周期感知的 CoroutineScope 与 Android Jetpack 集成。协程取代了 AsyncTask 等旧方案成为 Android 异步任务的首选方式。在 MVVM 架构中viewModelScope是 ViewModel 内置的协程作用域随 ViewModel 销毁自动取消从根本上避免了协程泄漏。三、完整的 MVVM 分层落地从 Repository 到 View一个生产级的 MVVM 应用通常包含数据层、ViewModel 层与 UI 层。下面以一个新闻列表功能为例展示完整的分层组织。数据层Repository 封装数据来源Repository 模式文档 指出Repository 将数据源与应用的其余部分分离充当持久化模型、Web 服务、缓存等不同数据源之间的中介。网络和数据库调用不再散落在 ViewModel 中而是被封装在 Repository 类里这让代码更干净、易读、可测试并为数据访问提供统一 API——应用其余部分不需要关心数据来自哪里只需要向 Repository 请求。class NewsRepository( private val remoteDataSource: NewsRemoteDataSource, private val localDataSource: NewsLocalDataSource ) { suspend fun fetchNews(): ListNewsItem { // 优先读缓存缓存未命中再走网络 localDataSource.cachedNews()?.let { return it } val fresh remoteDataSource.fetchNews() localDataSource.save(fresh) return fresh } }依赖注入用 Hilt 组装 MVVM 各层Hilt 文档 介绍Hilt 是 Android 的依赖注入库基于 Dagger 实现但大幅简化了手工 DI 的样板代码。只需在 Android 类上添加注解Hilt 就会自动生成并提供所需依赖。在 MVVM 架构中Hilt 负责将 Repository 注入 ViewModel、将 ViewModel 注入 View让各层解耦且便于测试替换。HiltViewModel class NewsViewModel Inject constructor( private val repository: NewsRepository ) : ViewModel() { ... }UI 层观察状态并响应式渲染在传统 View 体系中UI 通过observe()订阅 LiveData 或 StateFlow 状态在 Jetpack Compose 体系中UI 通过collectAsState()等组合函数消费状态流。Jetpack Compose 文档 描述了这个现代 UI 工具包的价值它提供声明式 UI 设计方式开发者只需描述 UI 在任意时刻应呈现的样子Compose 便会负责更新视图层级。这与 MVVM 的View 观察状态并渲染理念天然契合——UI 是状态的函数。Composable fun NewsScreen(viewModel: NewsViewModel hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() when (uiState) { is Loading - LoadingIndicator() is Success - NewsList(uiState.items) is Error - ErrorMessage(uiState.message) } }四、MVVM 中状态管理的完整链路综合以上组件一个完整 MVVM 状态管理链路如下事件入口View 捕获用户交互点击、输入调用 ViewModel 的公开方法逻辑处理ViewModel 在viewModelScope中执行业务逻辑通过 Repository 访问数据状态更新ViewModel 将结果写入MutableStateFlow或MutableLiveData响应式渲染View 观察状态变化仅当组件处于活跃生命周期时接收更新并重绘 UI生命周期安全配置变更时 ViewModel 存活、状态不丢ViewModel 销毁时协程自动取消。这条链路的每一步都能在本仓库 Android 路线图对应的主题文档中找到依据状态与生命周期ViewModel 状态、状态变更响应式数据LiveData、Flow异步基础协程数据封装Repository 模式依赖注入Hilt声明式 UIJetpack Compose五、MVVM 使用建议与注意事项综合 MVVM 文档 及关联主题文档落地 MVVM 时有以下几点建议View 保持轻薄所有状态决策交给 ViewModelView 只做渲染与事件转发避免在 UI 层堆积业务逻辑用状态驱动 UI优先采用单向数据流事件 → ViewModel → 状态 → View让界面行为可预测、可测试LiveData 与 StateFlow 按需选择传统 View 体系可用 LiveData 享受生命周期感知Compose 或需要背压、复杂流式变换的场景优先 StateFlow collectAsStateWithLifecycleRepository 统一数据访问将网络、数据库、缓存访问封装进 RepositoryViewModel 不直接触碰数据源Hilt 管理依赖通过依赖注入组装各层提升可测试性与可替换性不要生搬硬套如 架构与设计模式文档 所述架构是指导而非铁律应根据项目规模与团队习惯适度调整分层细节。六、小结MVVM 是 Android 官方推荐的架构范式其核心在于通过 ViewModel 将 UI 与业务逻辑解耦并借助 LiveData、StateFlow 等响应式组件实现状态驱动的界面渲染。在本仓库的 Android 路线图中MVVM 文档与其周边的 ViewModel 状态、LiveData、Flow、协程、Repository、Hilt 与 Jetpack Compose 等主题共同构成了一条完整的现代 Android 架构学习路径——从架构理念到状态管理、从数据封装到依赖注入最终落实到一套可运行、可测试、可维护的生产级 UI 架构方案。赞分享文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载相关推荐前端水印利器watermark-js-plusCanvas水印的完整使用指南在当今数字化时代图片版权保护和文档防复制已成为前端开发的重要需求。 watermark js plus 作为一款基于Canvas的浏览器水印库为开发者提供了文档教程MuJoCo 打滑问题排查手册一文读懂摩擦与接触参数快速收敛不稳的仿真MuJoCo 打滑问题排查手册一文读懂摩擦与接触参数快速收敛不稳的仿真 用 MuJoCo一款专注多关节接触刚体动力学的主流物理仿真器模拟夹爪抓取小木块时物理引擎机器人机器学习图形学YOLOF模型部署指南轻松实现工业级目标检测应用YOLOF模型部署指南轻松实现工业级目标检测应用 想要快速部署一个高效的目标检测模型吗YOLOFYou Only Look One level Fe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

OpenShell:把Win10/Win11开始菜单调回经典样式,安装配置与进阶玩法全攻略

OpenShell:把Win10/Win11开始菜单调回经典样式,安装配置与进阶玩法全攻略

如果你是从 Windows 7 一路用过来的老用户,第一次面对 Windows 8/10/11 那个铺满磁贴和推荐应用的新开始菜单时,多半会有一种感觉:微软把我用了几十年的入口换掉了,我却连控制面板都找不着。我第一次升级到 Win10 之后真的纠结了很…

📅 2026/10/4 10:22:59
JavaWeb学生信息管理系统大作业:完整源码+建表SQL+课程设计报告,跑通CRUD全流程

JavaWeb学生信息管理系统大作业:完整源码+建表SQL+课程设计报告,跑通CRUD全流程

简介:这是一套面向计算机相关专业学生的 JavaWeb 期末大作业完整项目,以学生信息管理系统为主题,适合正在准备课程设计、期末大作业或需要项目实战练习的学习者参考使用。项目结构完整,包含源代码、数据库建表脚本与配套课程设计报…

📅 2026/10/4 10:22:59
主流AI论文工具梯队榜(2026 深度测评)

主流AI论文工具梯队榜(2026 深度测评)

基于功能完整性、学术适配性、用户反馈及操作便捷性,以下是当前主流AI论文写作工具的深度测评榜单,按综合使用价值从高到低进行排序,并附上核心功能亮点与适用人群说明。🏆 第一梯队:全流程学术解决方案(★…

📅 2026/10/4 10:22:59
MORE NEWS

更多资讯

📰

用Python Tkinter开发反应力测试小游戏:GUI编程与事件驱动实战

前阵子整理电脑里的 Python 练习项目,翻到一个很早写的“测反应力”小游戏。东西不复杂,核心就一个按钮、一个计时器、几个状态切换,但确实是练Python GUI编程特别合适的入门项目。很多人一提到图形化小游戏,总觉得得用 pygame 这…

📰

Claude Code Skills 简介:用 SKILL.md 与 Progressive Disclosure 构建 Agent Skills

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MRAM与TM4C1299在工业嵌入式存储中的应用实践

做工业嵌入式这行,和数据打交道是躲不掉的。最近一个项目中,我用了 Everspin 的 MR25H40CDF(4Mbit SPI MRAM),搭配 TI 的 TM4C1299KCZAD(Cortex-M4F 主控,120MHz 主频),专…

📰

SPI MRAM与TM4C1299的工业存储实践:掉电不丢数据

做工业设备的这几年,我越来越觉得“存数据”比“算数据”更考验人。工控现场要记报警、存参数、保存掉电瞬间的状态,传统方案要么用EEPROM慢慢磨,要么用Flash先擦后写,动不动还得加个电池。直到接触了 Everspin 的 MR25H40CDF 这颗…

📰

基于价值认同与ADMM的需求侧电能共享分布式交易策略及Matlab实现

最近总有人拿着类似的题目来找我讨论:需求侧的电能共享交易,为什么一定要"分布式"?"价值认同"这种词,听着就像从社会学论文里搬过来的,怎么翻译成能写进Matlab的矩阵?其实这两个问题本…

📰

AI硬件设计辅助:构建视觉感知层让AI看懂电路图纸

把 AI 请进硬件设计流程,最难的不是让 AI 学会“理解”原理图,而是先让它“看得见”。这个系列前一篇把整体问题定义清楚了,这篇专门拆解视觉感知层:怎么让 AI 像工程师一样,对着原理图、PCB 截图、规格书扫描件&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬