news 2026/5/30 18:37:41

【大前端】【Android】一文详解Android MVVM 模式详情解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【大前端】【Android】一文详解Android MVVM 模式详情解析

Android MVVM 模式详情解析

一、为什么需要 MVVM?

在早期 Android 开发中,常见架构是:

  • Activity / Fragment = 上帝类

  • UI 控制 + 业务逻辑 + 网络请求 + 数据处理 全部混在一起

典型问题:

  • ❌ Activity 过于臃肿(上千行)

  • ❌ 逻辑与 UI 强耦合,难以测试

  • ❌ 页面复用性差

  • ❌ 维护成本极高

👉MVVM(Model–View–ViewModel)的核心目标:

分离 UI 与业务逻辑,让界面只负责展示,逻辑由 ViewModel 处理


二、MVVM 架构概览

1️⃣ 架构组成

View(Activity / Fragment) ↓ 观察 ViewModel ↓ 调用 Model(Repository / DataSource)
层级职责
View负责 UI 展示、事件分发
ViewModel负责业务逻辑、状态管理
Model数据来源(网络 / 数据库 / 本地)

三、各层职责详解

1️⃣ View(Activity / Fragment)

只做三件事:

  1. 初始化 UI

  2. 监听 ViewModel 数据变化

  3. 把用户操作交给 ViewModel

❌ View不应该做的事情

  • 网络请求

  • 数据解析

  • 业务判断

示例:

class UserActivity : AppCompatActivity() { private val viewModel: UserViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_user) viewModel.userLiveData.observe(this) { // 只负责刷新 UI textView.text = it.name } button.setOnClickListener { viewModel.loadUser() } } }

2️⃣ ViewModel(核心)

ViewModel 是 MVVM 的灵魂

职责:

  • 处理业务逻辑

  • 保存 UI 状态

  • 提供可观察数据(LiveData / StateFlow)

特点:

  • 不持有 View 的引用

  • 生命周期比 Activity 长(配置变更不销毁)

  • 可单元测试

示例:

class UserViewModel( private val repository: UserRepository ) : ViewModel() { private val _userLiveData = MutableLiveData<User>() val userLiveData: LiveData<User> = _userLiveData fun loadUser() { viewModelScope.launch { val user = repository.getUser() _userLiveData.value = user } } }

3️⃣ Model(数据层)

通常由Repository 模式组成:

Repository ├── RemoteDataSource(网络) └── LocalDataSource(数据库 / 缓存)

Repository 的职责:

  • 屏蔽数据来源

  • 统一数据入口

  • 控制缓存策略

示例:

class UserRepository( private val api: UserApi ) { suspend fun getUser(): User { return api.getUser() } }

四、MVVM 中的数据驱动思想

1️⃣ 核心理念

UI = 数据的映射结果

不再主动“刷新 UI”,而是:

  • 数据变 → UI 自动更新

Android 常用方案:

技术场景
LiveData传统 Android
StateFlowKotlin 协程
DataBindingXML 直接绑定

2️⃣ LiveData vs StateFlow

对比项LiveDataStateFlow
生命周期感知否(需 repeatOnLifecycle)
Kotlin 友好一般非常好
冷/热流
推荐程度⭐⭐⭐⭐⭐⭐⭐

五、MVVM + Jetpack 推荐组合

官方推荐:

MVVM + ViewModel + LiveData / StateFlow + Room + Retrofit + Hilt

示意图:

UI → ViewModel → Repository → DataSource ↑ StateFlow

六、常见错误 & 反模式

❌ 1. ViewModel 持有 Context / View

class BadViewModel(val context: Context) // ❌

✅ 正确方式:

  • 把资源、Toast、跳转交给 View

  • 或使用 Event 通知


❌ 2. ViewModel 过度膨胀

把所有逻辑都塞进 ViewModel

✅ 建议:

  • 复杂逻辑下沉到 UseCase / Domain 层

  • ViewModel 只做“协调者”


❌ 3. LiveData 用来做一次性事件

例如 Toast / 跳转:

LiveData<Boolean> // ❌ 会重复触发

✅ 正确方式:

  • SingleLiveEvent

  • Channel / SharedFlow


七、进阶:MVVM + Clean Architecture

View ↓ ViewModel ↓ UseCase ↓ Repository ↓ DataSource

优势:

  • 更易测试

  • 复杂业务可控

  • 大型项目首选


八、MVVM 的优缺点总结

✅ 优点

  • 清晰分层

  • UI 与逻辑解耦

  • 易测试

  • 生命周期安全

❌ 缺点

  • 初学成本高

  • 小项目略显“重”

  • 设计不当仍会臃肿


九、什么时候该用 MVVM?

项目规模是否推荐
Demo / 小工具
中型 App
大型 / 长期维护项目⭐⭐⭐⭐

十、一句话总结

MVVM 的本质是:用数据驱动 UI,用 ViewModel 隔离复杂性


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 20:04:01

46、Asterisk VoIP系统配置指南

Asterisk VoIP系统配置指南 1. Asterisk模块加载建议 对于Asterisk新手而言,由于其模块较为“挑剔”,为避免出现问题,最好自动加载 modules 目录下的所有模块。随着对Asterisk的熟悉程度增加,可以使用 noload 指令明确告知Asterisk不加载不需要的模块。 2. Asterisk…

作者头像 李华
网站建设 2026/5/30 14:06:42

14、充分利用语言的完整工具集

充分利用语言的完整工具集 在配置管理中,我们常常需要高效地管理和分配资源。Puppet 提供了一系列强大的功能,让我们可以更灵活地处理各种资源。下面将详细介绍 Puppet 中的资源标签、资源导出与导入、资源参数覆盖以及资源默认值等重要特性。 资源标签的使用 Puppet 会隐…

作者头像 李华
网站建设 2026/5/29 19:08:24

AI算力:驱动智能时代多元计算与高效调度的基础

各行各业正被人工智能发展浪潮以前所未有的力道进行重塑&#xff0c;而且支撑其运作的底层基础是算力。换种通俗易懂的说法&#xff0c;AI算力是指用来执行人工智能算法&#xff0c;对海量数据予以处理以及解析所需要的计算能力。它不是一项简单的硬件指标&#xff0c;而是包含…

作者头像 李华
网站建设 2026/5/29 19:05:14

AI知识库的构建:从数据采集、处理到高效检索的全流程解析

AI知识库的搭建以及运用属于一项具备系统性的工程项目&#xff0c;它的关键之处在于怎样以高效且精准地把领域方面的知识给予人工智能系统&#xff0c;从而让其拥有专业领域范畴内的认知以及推理能力。这个进程一般被称作“知识库投喂”或者“知识灌注”&#xff0c;它并非仅仅…

作者头像 李华
网站建设 2026/5/29 19:19:32

Git工作流程指南: 基础 Git 操作

基础 Git 操作 仓库初始化 # 创建新的仓库 git init# 克隆已经存在的仓库 git clone <repository_URL>文件操作 # 将文件添加到暂存区&#xff08;Staging Area&#xff09; git add <file_name> # 添加单个文件 git add . …

作者头像 李华
网站建设 2026/5/29 1:19:35

Modelsim联合高云ip仿真流程

一、改变工作器件库打开modelsim&#xff0c;调整工作器件库&#xff1a;modelsim --> File --> Change Directory --> 选择modelsim的安装目录C:\modeltech64_10.7&#xff08;我装在C盘&#xff09;&#xff0c;点击选择文件夹&#xff0c;如下图。二、创建libirary…

作者头像 李华