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),仅供参考

相关新闻

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

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

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

2026/10/5 11:54:58 阅读更多 →
JavaWeb学生信息管理系统大作业:完整源码+建表SQL+课程设计报告,跑通CRUD全流程

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

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

2026/10/5 11:10:55 阅读更多 →
主流AI论文工具梯队榜(2026 深度测评)

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

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

2026/10/5 11:32:00 阅读更多 →

最新新闻

基于bpmn-js打造生产级流程设计器:扩展点与踩坑实践

基于bpmn-js打造生产级流程设计器:扩展点与踩坑实践

做 BPMN 流程设计器这件事,我从 Vue 2 bpmn-js 7 时代一路折腾到现在 React 18 bpmn-js 15,项目前后换了好几轮,踩过的坑确实能写成本书。很多人看到"打造功能最全/强的 bpmn-js 流程设计器"这种标题,第一反应是"…

2026/10/5 13:54:19 阅读更多 →
论文里最被低估的“加分项”,不是数据,是图

论文里最被低估的“加分项”,不是数据,是图

如果你问一个有经验的期刊编辑:什么样的稿件最让人头疼? 答案大概率不是“数据不够漂亮”,而是“图不听话” 。 什么叫图不听话?就是图片自己不会说话。读者必须反复翻回正文,对照着文字才能理解这张图在展示什么。图注…

2026/10/5 13:54:19 阅读更多 →
EF Core外部Model实战:从分层架构到动态加载

EF Core外部Model实战:从分层架构到动态加载

1. 外部Model不是玄学:先看清真实场景再动手先说个我自己的体会。EF Core 使用外部 Model这句话第一次听到时,我以为是某种复杂黑科技,比如运行时反射读取 DLL、动态拼装实体什么的。实际落地之后发现,它解决的问题非常接地气&…

2026/10/5 13:54:19 阅读更多 →
插件加载失败排查全解析:从激活报错到可插拔架构设计

插件加载失败排查全解析:从激活报错到可插拔架构设计

1. 插件系统到底在做什么:加载、注册、激活的三段式先说个我自己的经历。前两年接手一个老项目的维护,代码里塞了十几个内部插件,启动时控制台直接抛出一行错误:failed to load plugins web boot: 2 entries did not activate。当…

2026/10/5 13:54:19 阅读更多 →
从仿真结果到决策图表:TransModeler交通数据分析与可视化全流程

从仿真结果到决策图表:TransModeler交通数据分析与可视化全流程

做了这么多年交通仿真咨询,我越来越确定一件事:仿真模型跑完,只是整个项目的上半场。真正决定方案能不能被甲方采纳的,是下半场——数据分析与可视化。TransModeler这套交通仿真软件,在路网建模和微观仿真上确实能打&a…

2026/10/5 13:54:19 阅读更多 →
Bert+CRF三元组识别:从数据标注到模型训练实战

Bert+CRF三元组识别:从数据标注到模型训练实战

简介:这套NLP实战资源以BertCRF三元组识别为主题,面向希望入门信息抽取、知识图谱构建的Python学习者与开发者。项目聚焦从非结构化文本中识别主体、谓词、客体,例如“马云是阿里巴巴的创始人”这类三元组,可支撑问答系统、语义搜…

2026/10/5 13:53:19 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/4 20:14:29 阅读更多 →