Android-MVX工艺总结

news/2025/10/17 11:36:52/文章来源:https://www.cnblogs.com/wzzkaifa/p/19147391

1. MVC (Model-View-Controller)

本质与作用:

MVC 是最经典的架构模式,它的核心思想是职责分离。Model 负责数据和业务逻辑,View 负责 UI 展示,Controller 负责处理用户输入并协调 View 和 Model 的交互。

转换的意义:

“搬运工”,承担了过多的责任。就是它将业务逻辑从 UI 界面中剥离出来,避免了所有代码都堆砌在 View(如 Android 中的 Activity)中。但在实际应用中,尤其是移动端编写,Controller 常常变得臃肿,它既要处理 UI 事件,又要手动更新 UI,导致 View 和 Controller 之间存在紧密耦合。Controller 既是“指挥官”,又

2. MVP (Model-View-Presenter)

本质与作用:

为了解决 MVC 中 View 和 Controller 的紧密耦合,MVP 应运而生。它引入了 Presenter,作为 View 和 Model 之间的“中间人”。View 变成了被动的接口,Presenter 不直接持有 View 实例,而是通过 View 接口来与 View 通信。Presenter 负责处理所有的业务逻辑,并手动调用 View 接口方法来更新 UI。

转换的意义:

MVP 的最大意义在于彻底解耦了 View 和 Presenter。Presenter 不依赖于具体的 Android 组件(如 Activity、Fragment),因此可以独立进行单元测试。这使得业务逻辑的可测试性大大提高。然而,这种模式的障碍在于 Presenter 仍然需要手动调用 view.showData() 或 view.updateUI() 等方法来更新 UI,这种命令式的更新方式依然繁琐,而且 Presenter 和 View 之间形成一对一的强依赖,导致 Presenter 的生命周期管理变得复杂,容易引发内存泄漏(需要手动调用 detachView())。

3. MVVM (Model-View-ViewModel)

本质与作用:

MVVM 的出现,是为了消除 MVP 中命令式 UI 更新的痛点。它引入了 ViewModel,并结合材料绑定(Data Binding)技术。ViewModel 封装了 UI 状态和信息,并通过 LiveData 或 StateFlow 等可观察对象暴露给 View。View 不再需要手动调用途径更新自己,而是声明式地将 UI 组件与 ViewModel 中的数据绑定起来。当 ViewModel 中的数据改变时,View 会自动刷新。

转换的意义:

通过这是从“命令式编程”到“声明式编程”的范式升级。开发者从繁琐的 UI 更新运行中解放出来,可以更专注于业务逻辑的实现。ViewModel 独立于 Android 组件的生命周期,能够安全地保存素材,解决了屏幕旋转等配置变更导致的数据丢失问题,并且不需要手动管理内存泄漏。MVVM 让代码更精简、更易于维护和测试。

4. MVI (Model-View-Intent / Model-View-Interpreter)

本质与作用:

View → Intent → Model → State → View 的闭环,清晰且可预测。就是MVI 的核心思想是单向数据流(Unidirectional Data Flow)和不可变状态(Immutable State)。它将用户操作封装为“意图(Intent)”,意图传递给“模型(Model)”,模型处理意图后产生一个新的、不可变的“状态(State)”,View 只是被动地根据这个最新的状态来渲染 UI。整个数据流

转换的意义:

MVI 进一步强化了可预测性和可调试性。由于整个应用的状态由一个单一的、不可变的对象来管理,开发者可以十分清晰地追踪状态的每一次变化。这在处理艰难、多变的用户交互和状态管理时十分有用。例如,在调试时,你许可回溯所有的历史状态来重现挑战。MVI 模式特定适合那些业务状态复杂的应用,如电商购物车、社交动态流等,它有效地避免了状态混乱和“资料交叉感染”的问题。它代表了当前函数式编程思想在移动端 UI 架构中的实践。

5.为什么使用MVVM

首先,传统的MVC模式因为其耦合度高,导致单元测试编写困难;而MVP模式虽然在一定程度上降低了耦合度,但在接口粒度控制上仍存在挑战。这两种模式都未能完全满足公司对架构设计的要求。

同时,尽管 MVI模式被认为能够消除上述问题,但由于其在公司内部是全新的技术栈,团队成员需投入大量的学习成本,这与项目紧迫的交付周期相冲突,因此MVI模式暂时被排除。

综合以上考量,MVVM,公司团队对 MVVM 模式有着丰富的经验,这能够显著减少学习和开发成本,确保计划按时交付。就是模式成为了最优解。它通过拥护 View 和 ViewModel 之间的双向数据绑定,使视图层变得完全无状态化,大大简化了开发流程。更重要的

此外,在具体的技术栈实施上,实习中采取了分阶段策略,以兼顾效率与技术更新:现有基于Java的成熟模块将被复用,以加速交付周期;而所有新功能将使用Kotlin进行开发。这一选择得益于 Android 官方的Jetpack组件对 Kotlin 的良好拥护,这一组合不仅能提升开发效率,还能有效减少潜在的 bug,从而确保新功能的稳定性和质量。

6.MVVM+jetpack结合

数据驱动 UI 的工作流程

UI 获得 ViewModel 实例:工作流程始于 View(通常是 ActivityFragment)获取一个 ViewModel 的实例。View 并不直接持有或管理数据,它只知道如何从 ViewModel 获取数据。

这个过程并非直接通过 new ViewModel() 完成,而是通过 ViewModelProvider 类实现。在底层,ViewModelProvider 会检查一个名为 ViewModelStore 的内部容器,来查找是否已有目标 ViewModel 的实例。如果存在,它会直接返回这个已有的实例,确保在配置变更(如屏幕旋转)时数据不会丢失。如果不存在,ViewModelProvider 则会调用其内部的 Factory 来创建新的 ViewModel 实例,并将其存入 ViewModelStore 中,供后续使用。

ViewModel 持有 LiveDataViewModel 负责从数据源(例如网络或数据库)获取数据,并将数据包装在 LiveData 对象中。LiveData 是一个可观察的数据持有者,这是实现数据驱动 UI 的关键。

LiveData 的核心是其生命周期感知能力。当你调用 liveData.observe(lifecycleOwner, observer) 方法时,LiveData 会在内部将传入的 observerlifecycleOwner 的生命周期状态绑定。当 lifecycleOwner 的生命周期变为 STARTEDRESUMED 状态时,LiveData 的内部机制会将其标记为“活跃”;当其变为 STOPPEDDESTROYED 状态时,则标记为“非活跃”。这种机制保证了 LiveData 只会在 UI 处于安全状态时才分发数据,从根源上防止了因 UI 不可见而导致的内存泄漏和崩溃。

DataBinding 建立连接DataBinding 在幕后工作,通过 XML 布局文件中的绑定表达式,为 UI 元素(如 TextView)和 ViewModel 中的 LiveData 对象建立起连接。UI 元素现在“监听”着 LiveData

DataBinding 的连接工作是在编译时完成的。当你在 XML 布局文件中使用绑定表达式时,编译工具会自动生成一个名为 XXXBinding 的绑定类(例如 ActivityMainBinding)。这个生成的类在内部持有对布局文件中所有 View 的引用,并包含一个 setViewModel() 方法来注入你的 ViewModel 实例。最关键的是,这个生成的类会通过调用 livedata.observe(lifecycleOwner, ...) 方法,在幕后为所有绑定的 LiveData 对象注册一个观察者

数据变化并自动更新 UI:当 ViewModel 中的数据发生变化时,它会更新 LiveData 对象的值。LiveData 会自动通知所有活跃的观察者(也就是 DataBinding)。DataBinding 接收到通知后,会立即、无须人工干预地更新所有与其绑定的 UI 元素。

ViewModel 中的数据发生变化时(例如调用 myLiveData.setValue(newData)),LiveData 的内部会通知其所有活跃的观察者。这个通知会传递给 DataBinding 生成的绑定类。在底层,这个绑定类会通过其观察者回调方法,根据数据变化来找到对应的 UI 元素(如一个 TextView),然后直接调用其相应的 setter 方法(如 setText()),将新数据设置到 UI 上。整个过程是完全自动化的,开发者无需编写任何手动更新 UI 的代码。

在 MVVM 架构中,数据与 View 的绑定交互是一个自动化且高效的过程。ViewModel中的资料被封装在LiveData对象里。在编译阶段,DataBinding会生成代码,将 View 和 LiveData 关联起来,从而使 View 成为 LiveData 的“观察者”。当 ViewModel 中的数据发生变化时,LiveData 会自动通知 DataBinding,然后 DataBinding 立即自动更新相应的 UI 元素。整个流程无需手动干预,实现了 UI 的被动更新,极大地简化了开发工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024ICPC(济南站)

I 签。有一个序列,每次你可以选择 恰 \(k\) 个数乘起来,并将这 \(k\) 个数删掉后替换成他们的乘积。 求最终序列最大值的最大可能值对 \(998244353\) 取模的结果。 \(n\le 2\times 10^5,k\le n,0\le V\le 10^9\)。直…

事件在react中的处理方式?

一、React 事件的本质 在 React 中,事件不是原生的 DOM 事件,而是 合成事件(SyntheticEvent)。 React 自己实现了一套跨浏览器的事件系统,用于封装原生事件,让你在所有浏览器中都能一致地使用。 也就是说: <…

volcano源码阅读——action/enqueue

enqueue 将pending状态的job的PodGroup状态设置为inqueue,当会话关闭的时候会更新PodGroup状态。PodGroup状态变为inqueue后,controller会为其创建Pod。pkg\scheduler\actions\enqueue\enqueue.go1 func (enqueue *A…

2025年工业大吊扇厂家权威推荐榜:大型厂房通风降温设备源头企业综合实力与客户口碑深度解析

2025年工业大吊扇厂家权威推荐榜:大型厂房通风降温设备源头企业综合实力与客户口碑深度解析随着工业4.0时代的深入发展,大型厂房的通风降温需求日益凸显。工业大吊扇作为改善工作环境、提升生产效率的关键设备,其技…

【左扬精讲】SRE 别慌!我用 故障预测与诊断,性能评估与优化,资源分配与规划 讲概率与贝叶斯算法的实战应用,都是咱运维人能懂的话(含代码)

【左扬精讲】SRE 别慌!我用 "故障预测与诊断","性能评估与优化","资源分配与规划" 讲概率与贝叶斯算法的实战应用,都是咱运维人能懂的话(含代码)在 SRE 的运维工作中,不确定性是…

农经权报表生成小程序介绍

背景 根据农经权gdb数据中的DK、CBF、FBF、CBFJTCYB、CBJYQDJB,以上要素和表数据进行逻辑提取和处理,将数据写出到定制好的word模板中 输入:农经权gdb、word模板、输出目录 输出:每户的摸底调查表以承包方编码&…

【2025-10-16】移居香港

20:00假使做事要面面顾到,那就什么事都不能做了。——XX昨天聊到了我的一个高中同学移居香港。这已经是我们7个要好的高中同学中第3个往香港走的了。其实,我还知道有一个老表近期也要到香港去做劳工,听说好像花了好…

学校社团招新的题目(莫队+树状数组统计区间逆序对个数)(蒟蒻被薄纱QAQ)

先放题面: A. 签到题 题目描述 你是城市的顶级信息分析师,负责监管全城的信息高速公路——一条长达 n 个信息节点的“数据高速公路”。 每个信息节点有一个编号 a[i],表示信息的优先级: 编号越小,信息越重要; 编…

基于MATLAB的齿轮故障检测

一、系统架构设计 %% 主程序框架 clear; clc; close all;%% 参数设置 fs = 10000; % 采样频率 t = 0:1/fs:1; % 时间向量 fault_types = {healthy,crack,wear,broken}; num_samples = 10; % 每类样本数量%% …

Linux 中检测gz压缩文件是否损坏

Linux 中检测gz压缩文件是否损坏。001、[s20233040742@admin2 x_test]$ ls a.sh b.sh [s20233040742@admin2 x_test]$ seq 10 | gzip > a.txt.gz [s20233040742@admin2 x_test]$ echo "xxx" > b.txt.…

从静态图表到交互叙事:数据可视化的新范式与实现 - 实践

从静态图表到交互叙事:数据可视化的新范式与实现 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

2025年信息流代运营服务商权威推荐榜:专业投放策略与高转化效果深度解析,助力企业精准营销

2025年信息流代运营服务商权威推荐榜:专业投放策略与高转化效果深度解析,助力企业精准营销在数字化营销浪潮中,信息流广告已成为企业获取流量、实现转化的重要渠道。随着算法技术的迭代和用户行为的变迁,信息流代运…

2025 年 PP 管厂家最新推荐榜:全面甄选优质 pp 风管、PP 喷淋塔等产品厂家,助力实验室场景精准选型

当前 PP 管市场虽供需活跃,但采购难题却让众多企业倍感困扰。部分厂家为追求利润,使用劣质原料生产,导致产品耐腐蚀性、抗老化性大幅下降,在使用中频繁出现破裂、渗漏问题,不仅造成经济损失,还带来安全隐患。同时…

基于MATLAB的无线传感器网络(WSN)仿真程序实现

一、系统架构设计 graph TD A[网络初始化] --> B[节点部署] B --> C[路由协议运行] C --> D[能量消耗计算] D --> E[性能评估] E --> F[可视化展示]二、核心代码实现 1. 网络参数初始化 %% 系统参数设置…

NMAP扫描

NMAP 扫描-sT — TCP connect 扫描 使用操作系统的 connect() 建立完整 TCP 连接(非特权用户可用)。容易被检测/记录,但兼容性最好。-sS — SYN(半开)扫描(又称 stealth) 发送 SYN 后根据返回包判断端口状态(…

MyEMS:衔接 “双控” 政策与企业实践的开源能源管理利器

在 “碳达峰、碳中和” 战略目标引领下,能源消费总量和强度双控制度(以下简称 “双控” 政策)已成为我国推动能源结构优化、倒逼企业绿色转型的核心抓手。然而,不少企业在落实 “双控” 要求时,面临着能耗数据碎片…

权限维持-Windows权限维持

权限维持-Windows权限维持 1.注册表权限维持Get-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Run | >> Format-List可以看到这里有个flag.bat执行文件,我们去文件资源管理器里面看看…

2025 电动轮椅厂家最新推荐榜:深度解析智能轻便 / 长续航 / 高安全国产优质品牌核心优势

随着人口老龄化加剧与残障人士出行需求升级,电动轮椅市场规模持续扩张,但行业乱象也随之凸显。市场上产品质量两极分化,部分产品宣称 “轻便折叠” 却因材质劣质导致机身笨重,标榜 “安全可靠” 却缺乏核心防护技术…

2025年信息流代运营服务商权威推荐榜单:专业投放策略与高效转化服务口碑之选

2025年信息流代运营服务商权威推荐榜单:专业投放策略与高效转化服务口碑之选在数字营销快速演进的今天,信息流广告已成为企业获取流量、实现转化的重要渠道。随着算法技术的不断升级和用户行为的日益复杂,信息流代运…

一些框架

一些框架1 OpenMCT:一套NASA阿姆斯研究中心开源Mission Control框架,专门帮你在浏览器或手机里展示、分析各种遥测数据