Android MVVM(Model-View-ViewModel)架构

Android MVVM(Model-View-ViewModel)架构是一种基于数据驱动的设计模式,旨在分离应用的 UI 逻辑与业务逻辑,提高代码的可维护性、可测试性和复用性。它在 MVC 和 MVP 的基础上发展而来,通过数据绑定(Data Binding)实现 View 与 ViewModel 的自动同步,减少了传统架构中大量的 findViewById 和事件监听代码。

MVVM 包含四个核心部分:ModelViewViewModel ,以及可选的Repository(用于数据层封装)。

1. Model(模型)
  • 作用:负责存储和处理应用的业务数据,包含数据结构、业务逻辑、数据获取(如网络请求、数据库操作)等。
  • 特点:与 UI 层完全解耦,不依赖 View 或 ViewModel,仅关注数据本身。
  • 示例
    • 数据实体类(如UserArticle等 Java/Kotlin 数据类)。
    • 数据处理类(如网络请求工具ApiService、数据库操作UserDao)。
2. View(视图)
  • 作用:对应 Android 中的 UI 组件(如 Activity、Fragment、XML 布局),负责展示数据并接收用户交互(如点击、输入)。
  • 特点:不包含业务逻辑,仅通过数据绑定与 ViewModel 关联,当 ViewModel 中的数据变化时,View 会自动更新。
  • 示例
    • XML 布局文件(通过 Data Binding 绑定 ViewModel 的属性和方法)。
    • Activity/Fragment(负责初始化 View、绑定 ViewModel,不处理业务逻辑)。
3. ViewModel(视图模型)
  • 作用:作为 View 与 Model 之间的桥梁,负责处理 UI 相关的业务逻辑,管理数据并将其暴露给 View。
  • 特点
    • 持有 Model 的引用,通过 Repository 获取或处理数据。
    • 不依赖 View(不持有 Activity/Fragment 的引用),生命周期与 View 无关(由 Android 系统管理,可在配置变化如屏幕旋转时保留数据)。
    • 通过可观察数据(如 LiveData、Flow)通知 View 数据变化。
4. Repository(仓库,可选但推荐)
  • 作用:统一管理数据来源(如网络、数据库、本地缓存),为 ViewModel 提供干净的数据接口,隐藏数据获取的细节。
  • 特点:解耦 ViewModel 与具体的数据获取方式(如从网络还是数据库取数据),便于切换数据来源。

MVVM 的核心机制:数据绑定(Data Binding)

数据绑定是 MVVM 实现 View 与 ViewModel 联动的关键,它允许在 XML 布局中直接绑定 ViewModel 的属性和方法,实现双向或单向数据同步。

  • 单向绑定:ViewModel 的数据变化自动更新到 View(如文本、列表刷新)。
  • 双向绑定 :View 的用户输入(如 EditText 内容)自动同步到 ViewModel 的属性(通过@={variable}语法)。

MVVM 的工作流程

  1. View 初始化:Activity/Fragment 创建时,初始化 ViewModel,并通过 Data Binding 将 View 与 ViewModel 绑定。
  2. 用户交互:用户操作 View(如点击按钮),通过绑定调用 ViewModel 的方法。
  3. 数据处理:ViewModel 接收请求后,调用 Repository 获取或处理数据(如网络请求、数据库操作)。
  4. 数据更新:Repository 将处理结果返回给 ViewModel,ViewModel 更新可观察数据(如 LiveData)。
  5. UI 自动刷新:由于数据绑定,View 会自动感知 ViewModel 的数据变化并更新 UI。

MVVM 的优势

  • 低耦合:View 与 ViewModel 分离,ViewModel 与 Model 分离,各组件独立开发和测试。
  • 可测试性:ViewModel 不依赖 Android 框架(如 Activity),可通过单元测试直接验证业务逻辑。
  • 数据驱动:通过数据绑定减少模板代码,UI 自动响应数据变化,开发效率更高。
  • 适应配置变化:ViewModel 生命周期独立于 View,屏幕旋转等配置变化时不会重新创建,数据得以保留。

MVVM 在 Android 中的实践工具

  • ViewModel & LiveData:Android Jetpack 组件,ViewModel 管理数据,LiveData 实现数据可观察性(生命周期感知)。
  • Data Binding:官方库,实现 XML 与 ViewModel 的绑定,支持单向 / 双向绑定。
  • Kotlin Flow & StateFlow:替代 LiveData 的响应式编程工具,更适合复杂数据流处理。
  • Hilt:依赖注入框架,简化 ViewModel、Repository 等组件的实例创建和依赖管理。
  • Room:本地数据库框架,常与 Repository 配合用于数据持久化。

与 MVP 的区别

  • MVP中,Presenter 需持有 View 的引用,通过接口调用 View 的方法更新 UI,存在一定耦合;
  • MVVM中,ViewModel 不持有 View 引用,通过数据绑定自动同步,完全解耦,更适合大型项目。

总之,MVVM 是 Android 开发中推荐的架构模式,尤其适合数据驱动的应用(如新闻、电商 App),结合 Jetpack 组件可大幅提升开发效率和代码质量。

相关推荐
眠りたいです19 小时前
基于脚手架微服务的视频点播系统-脚手架开发部分-brpc中间件介绍与使用及二次封装
c++·微服务·中间件·rpc·架构·brpc
Broken Arrows20 小时前
k8s学习(二)——kubernetes整体架构及组件解析
学习·架构·kubernetes
BD_Marathon21 小时前
【MySQL】函数
android·数据库·mysql
西西学代码1 天前
安卓开发---耳机的按键设置的UI实例
android·ui
唐僧洗头爱飘柔95271 天前
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
java·spring·spring cloud·微服务·架构·resttemplate·java微服务技术栈
可触的未来,发芽的智生1 天前
触摸未来2025.10.05:悟神经网络符号之伤,拥抱声音的宇宙
人工智能·python·神经网络·算法·架构
maki0771 天前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
yunmi_1 天前
微服务,Spring Cloud 和 Eureka:服务发现工具
java·spring boot·spring cloud·微服务·eureka·架构·服务发现
一叶飘零_sweeeet1 天前
从 0 到 PB 级存储:MinIO 分布式文件系统实战指南与架构解密
java·架构·大文件存储
千里马学框架1 天前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio