当前位置: 首页 > news >正文

Android MVVM架构模式,详详详细学习

MVVM(Model-View-ViewModel)

是一种基于数据绑定的架构模式,用于设计和组织应用程序的代码结构。它将应用程序分为三个主要部分:Model(模型)、View(视图)和ViewModel(视图模型)。

  • Model(模型):负责处理数据和业务逻辑。它可以是从网络获取的数据、数据库中的数据或其他数据源。Model层通常是独立于界面的,可以在多个界面之间共享。
  • View(视图):负责展示数据和与用户进行交互。它可以是Activity、Fragment、View等。View层主要负责UI的展示和用户输入的响应。
  • ViewModel(视图模型):连接View和Model,作为View和Model之间的桥梁。它负责从Model中获取数据,并将数据转换为View层可以直接使用的形式。ViewModel还负责监听Model的数据变化,并通知View进行更新。ViewModel通常是与View一一对应的,每个View都有一个对应的ViewModel。

MVVM的特点和优势

  1. 解耦合:MVVM通过将View和Model解耦合,使得它们可以独立开发和测试。ViewModel作为中间层,将数据从Model传递给View,避免了直接在View中处理业务逻辑的情况。
  2. 可维护性:MVVM的分层结构使得代码更易于维护。View只负责展示数据和用户交互,ViewModel负责处理业务逻辑和数据转换,Model负责数据的获取和存储。这种分离使得代码更加清晰和可读,也方便进行单元测试。
  3. 数据驱动UI:MVVM采用数据绑定的方式,将Model的数据与View进行绑定。当Model的数据发生变化时,ViewModel会自动更新View的显示,无需手动更新UI。这种方式可以减少手动更新UI的代码量,提高开发效率。
  4. 可测试性:由于MVVM的分层结构和数据驱动UI的特点,可以更容易地进行单元测试。ViewModel中的业务逻辑可以独立于View进行测试,而不需要依赖于Android系统或UI组件。

常见架构模式(MVC和MVP)区别

  • MVC(Model-View-Controller):MVC模式中,Controller负责处理用户输入和业务逻辑,Model负责数据和业务逻辑,View负责展示数据。与MVC相比,MVVM将Controller分离为ViewModel,将数据绑定的方式集成进来,使得代码更加简洁和清晰。
  • MVP(Model-View-Presenter):MVP模式中,Presenter负责处理用户输入和业务逻辑,Model负责数据和业务逻辑,View负责展示数据。与MVP相比,MVVM将Presenter分离为ViewModel

MVVM三个核心组件

在MVVM模式中,有三个核心组件:Model(模型)、View(视图)和ViewModel(视图模型)。它们各自具有不同的职责和作用,并通过数据绑定机制实现彼此之间的关系和交互。

Model(模型):

  • 职责:负责处理数据和业务逻辑。它可以是从网络获取的数据、数据库中的数据或其他数据源。Model层通常是独立于界面的,可以在多个界面之间共享。 - 作用:提供数据和处理数据的方法,封装业务逻辑。 - 示例代码:
java public class User {     private String name;     private int age;       // getter and setter methods       // 数据获取的方法     public LiveData getUser() {       // 从网络或数据库获取用户数据       return userRepository.getUser();     }       // 数据更新的方法     public void updateUser(User user) {       // 更新用户数据       userRepository.updateUser(user);     }       // ...   }   

View(视图):

  • 职责:负责展示数据和与用户进行交互。它可以是Activity、Fragment、View等。View层主要负责UI的展示和用户输入的响应。 - 作用:将ViewModel中的数据展示给用户,并将用户的输入传递给ViewModel。 - 示例代码:
java public class MainActivity extends AppCompatActivity {        private UserViewModel userViewModel;        private TextView nameTextView;        private TextView ageTextView;            @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);                nameTextView = findViewById(R.id.nameTextView);            ageTextView = findViewById(R.id.ageTextView);                userViewModel = new ViewModelProvider(this).get(UserViewModel.class);            userViewModel.getUser().observe(this, user -> {                // 更新UI显示 nameTextView.setText(user.getName());                ageTextView.setText(String.valueOf(user.getAge()));            });        }            // 处理用户输入的方法 public void onUpdateUserClick(View view) {            // 从UI获取用户输入 String name = nameEditText.getText().toString();            int age = Integer.parseInt(ageEditText.getText().toString());                // 更新ViewModel中的数据 User user = new User(name, age);            userViewModel.updateUser(user);        }            // ...    }   

ViewModel(视图模型):

  • 职责:连接View和Model,作为View和Model之间的桥梁。它负责从Model中获取数据,并将数据转换为View层可以直接使用的形式。ViewModel还负责监听Model的数据变化,并通知View进行更新。ViewModel通常是与View一一对应的,每个View都有一个对应的ViewModel。 - 作用:处理View层的数据展示和用户交互,并与Model层进行交互。 - 示例代码:
javapublic class UserViewModel extends ViewModel {private User user;private UserRepository userRepository;
​
•    public UserViewModel() {
•      userRepository = new UserRepository();
•      user = new User();
•    }
​
•    // 获取数据的方法 public LiveData<User> getUser() {
•      return user.getUser();
•    }
​
•    // 更新数据的方法
•    public void updateUser(User user
​
) {user.updateUser(user);}
​// ...}

ViewModel通过数据绑定机制将Model的数据与View进行绑定,实现数据的自动更新。当Model的数据发生变化时,ViewModel会自动通知View进行更新。这种数据绑定的方式减少了手动更新UI的代码量,提高了开发效率。

下面是一个示意图,说明了MVVM模式中Model、View和ViewModel之间的关系和交互方式:

        +-------------+|    Model    |+-------------+||v        +-------------+|  ViewModel  |+-------------+||v+-------------+|     View    |+-------------+

在这个示意图中,ViewModel通过数据绑定机制将Model的数据绑定到View上,当Model的数据发生变化时,ViewModel会自动通知View进行更新,从而实现UI的自动刷新。用户的输入通过View传递给ViewModel,ViewModel再将数据传递给Model进行处理。

通过MVVM模式,Model、View和ViewModel之间的分离和解耦合,使得代码更易于维护和测试。ViewModel作为中间层,负责处理业务逻辑和数据转换,使得View层只关注UI的展示和用户交互,而不关心具体的业务逻辑和数据处理。这种分层结构和数据绑定的方式使得代码更加清晰、可读性更强,并提高了开发效率和代码质量。

MVVM数据绑定机制

在MVVM模式中,数据绑定是实现View和ViewModel之间数据同步的关键机制。它允许将View中的UI元素(如TextView、EditText)与ViewModel中的数据属性进行绑定,当数据发生变化时,自动更新UI,同时用户的输入也会自动同步到ViewModel中。

数据绑定的原理是通过观察者模式和反射机制实现的。当ViewModel中的数据发生变化时,会触发相应的通知,通知绑定的View进行更新。而当用户在View中输入数据时,数据绑定也会将输入的数据自动同步到ViewModel中。这种双向的数据同步机制,使得View和ViewModel之间实现了数据的实时同步。

在Android中,可以使用数据绑定库(如Data Binding)来实现MVVM模式中的数据绑定。Data Binding库提供了一组注解和工具类,可以简化数据绑定的实现过程。

以下是在Android中使用Data Binding库实现MVVM模式中的数据绑定的步骤:

  1. 配置Data Binding库:在项目的build.gradle文件中,添加Data Binding的插件和依赖项。
    // ...dataBinding {enabled = true}
}
​
dependencies {// ...implementation 'androidx.databinding:databinding-runtime:7.0.2'
}
  1. 创建布局文件:在布局文件中,使用标签包裹布局,并使用标签定义绑定的变量和表达式。
    <data><variable            name="user"type="com.example.mvvm.User" /></data><LinearLayout        android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}" /><TextView            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{String.valueOf(user.age)}" /></LinearLayout>
</layout>
  1. 创建ViewModel类:创建一个与View对应的ViewModel类,并在其中定义与布局文件中绑定的变量。
java
public class UserViewModel extends BaseObservable {private String name;private int age;
​// getter and setter methods
​@Bindable    public String getName() {return name;}
​public void setName(String name) {this.name = name;notifyPropertyChanged(BR.name);}
​@Bindable    public int getAge() {return age;}
​public void setAge(int age) {this.age = age;notifyPropertyChanged(BR.age);}
}
  1. 绑定数据:在Activity或Fragment中,使用DataBindingUtil类将布局文件与ViewModel进行绑定,并设置ViewModel的数据。
public class MainActivity extends AppCompatActivity {private UserViewModel userViewModel;
​@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
​// 创建ViewModel实例userViewModel = new UserViewModel();userViewModel.setName("John");userViewModel.setAge(25);
​// 绑定ViewModel和
​
布局文件 ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);binding.setUser(userViewModel);}
}

通过以上步骤,我们将布局文件和ViewModel进行了绑定,同时设置了ViewModel的数据。当ViewModel中的数据发生变化时,布局文件中相应的UI元素会自动更新。同时,当用户在UI元素中输入数据时,Data Binding库也会自动将输入的数据同步到ViewModel中。

使用数据绑定的好处是能够简化代码,减少手动更新UI的代码量,提高开发效率。它还能够降低代码的耦合性,使得UI和数据逻辑的修改更加灵活和独立。另外,数据绑定还能够提高代码的可读性和可维护性,使得代码更易于理解和调试。《更多内容可查了主页信息,可捕获进阶知识》

MVVM架构模式发展趋势

MVVM模式在Android开发中已经得到广泛应用,并且在未来仍然有着较大的发展潜力。以下是一些未来发展趋势:

Jetpack Compose:

Jetpack Compose是Google推出的一种全新的UI框架,它采用了声明式UI的方式,与MVVM模式非常契合。Jetpack Compose能够简化UI开发流程,提供更加灵活和响应式的UI编程方式。

数据驱动UI:

未来,数据驱动UI的概念将会更加普及和强调。MVVM模式的数据绑定和观察者模式是实现数据驱动UI的重要手段,未来可能会有更多的框架和工具出现,进一步简化数据和UI的绑定过程。

更强大的ViewModel组件:

Android Jetpack中的ViewModel组件已经为开发者提供了很多便利,但未来可能会有更多功能和特性被添加进来,以进一步提高ViewModel的灵活性和可扩展性。

跨平台开发:

MVVM模式的解耦特性使得代码更具可移植性,未来可能会有更多的跨平台开发框架和工具出现,使得开发者能够更轻松地在不同平台上使用MVVM模式进行开发。

相关文章:

Android MVVM架构模式,详详详细学习

MVVM&#xff08;Model-View-ViewModel&#xff09; 是一种基于数据绑定的架构模式&#xff0c;用于设计和组织应用程序的代码结构。它将应用程序分为三个主要部分&#xff1a;Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和ViewModel&#xff08;视…...

亿赛通电子文档安全管理系统 RCE漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…...

星际争霸之小霸王之小蜜蜂(三)--重构模块

目录 前言 一、为什么要重构模块 二、创建game_functions 三、创建update_screen() 四、修改alien_invasion模块 五、课后思考 总结 前言 前两天我们已经成功创建了窗口&#xff0c;并将小蜜蜂放在窗口的最下方中间位置&#xff0c;本来以为今天将学习控制小蜜蜂&#xff0c;结…...

JS的解析与Js2Py使用

JS的解析与Js2Py使用 JS的解析事件监听器搜索关键字请求关联JS文件 Js2PyJs2Py的简单使用安装Js2Py执行JavaScript代码调用JavaScript函数 Js2Py的应用示例创建JavaScript文件使用JavaScript JS的解析 在一个网站中&#xff0c;登录密码通常是会进行加密操作的&#xff0c;那么…...

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式&#xff08;Sin…...

SpringjDBCTemplate_spring25

1、首先导入两个包&#xff0c;里面有模板 2、transtion事务 jDbc操作对象&#xff0c;底层默认的是事务&#xff1a; 3、我们java一般对实体类进行操作。 4、第一步写好坐标。 创建一个Account表 数据修改用update 数据进去了...

设计模式——桥接模式

引用 桥我们大家都熟悉&#xff0c;顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来&#xff0c;而这两个被联系起来的结构可以独立的变化&#xff0c;所有其他的理解只要建立在这个层面上就会比较容易。 基本介绍 桥接模式&#xff08;Br…...

改进YOLO系列:2.添加ShuffleAttention注意力机制

添加ShuffleAttention注意力机制 1. ShuffleAttention注意力机制论文2. ShuffleAttention注意力机制原理3. ShuffleAttention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ShuffleAttention注意力机制论文 论文题目:SA-NET: SHUFFLE ATTENTION …...

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…...

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…...

【JavaEE进阶】MyBatis的创建及使用

文章目录 一. MyBatis简介二. MyBatis 使用1. 数据库和数据表的创建2. 创建Mybatis项目2.1 添加MyBatis框架支持2.2 设置MyBatis配置信息 3. MyBatis开发流程4. MyBatis查询数据库测试 三. MyBatis 流程1. MyBatis 查询数据库流程2. MyBatis 框架交互流程图 一. MyBatis简介 M…...

职业学院物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…...

3 个 ChatGPT 插件您需要立即下载3 ChatGPT Extensions You need to Download Immediately

在16世纪&#xff0c;西班牙探险家皮萨罗带领约200名西班牙士兵和37匹马进入了印加帝国。尽管印加帝国的军队数量达到了数万&#xff0c;其中包括5,000名精锐步兵和3,000名弓箭手&#xff0c;他们装备有大刀、长矛和弓箭等传统武器。但皮萨罗的军队中有100名火枪手&#xff0c;…...

屏蔽socket 实例化时,握手阶段报错信息WebSocket connection to ‘***‘ failed

事情起因是这样的&#xff1a; 我们网站是需要socket链接实行实时推送服务&#xff0c;有恶意竞争对手通过抓包或者断网&#xff0c;获取到了我们的socket链接地址&#xff0c;那么他就可以通过java写一个脚本无限链接这个socket地址。形成dos攻击。使socket服务器资源耗尽&…...

单发多框检测(SSD)【动手学深度学习】

单发多框检测模型主要由一个基础网络块和若干多尺度特征块串联而成。基本网络用于从输入图像中提取特征,可以使用深度卷积神经网络,原论文中选用了在分类层之前阶段的VGG,现在也常用ResNet替代。 我们可以设计基础网络,使它输出的高和宽较大,这样基于该特征图生成的锚框数…...

“RFID与光伏板的完美融合:探索能源科技的新时代!“

随着科技的不断发展&#xff0c;人类创造出了许多令人惊叹的发明。其中&#xff0c;RFID&#xff08;Radio Frequency Identification&#xff09;技术的应用在各个领域日益广泛。最近的研究表明&#xff0c;将RFID技术应用于光伏板领域&#xff0c;不仅可以提高光伏板的效率&a…...

算法leetcode|71. 简化路径(rust重拳出击)

文章目录 71. 简化路径&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;样例 4&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 71. 简化路径&#xff1a;…...

网络技术Vlan技术STP(第一课)

一 Vlan技术的学习 对命令的增删改查 #### 1&#xff09;创建vlan[SW1]vlan 2 [2-4094] 创建vlan[SW1]vlan batch 10 20 30 创建多个不连续的vlan[SW1]display vlan 查看vlan信息[SW1]vlan batch 50 to 60创建多个连续的vlan[SW1]vlan2[SW1-vlan2]description caiwu添加描述信…...

SpringBoo t+ Vue 微人事 (十一)

职位修改操作 在对话框里面做编辑的操作 添加对话框 <el-dialogtitle"修改职位":visible.sync"dialogVisible"width"30%"><div><el-tag>职位名称</el-tag><el-input size"small" class"updatePosIn…...

自动驾驶卡车量产-第一章-用户需求

1、中国干线物流行业现状 万亿级市场&#xff0c;规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%&#xff0c;全国中重卡保有量约730 万台1&#xff0c;市场规模达4.6 万亿元1&#xff0c;体量全球第一&#xff0c;超过同城物流及乘用出租市场规模之和。同样&…...

Nginx 配置文件的完整指南 (一)

文章目录 一、简介1.1 配置文件一览 二、全局配置2.0 user2.1 worker_processes2.2 events模块2.3 http模块 三、server模块3.1 listen3.2 server_name3.3 location&#xff1a;请求处理位置 Nginx 配置文件的完整指南 (二) 一、简介 Nginx是一款高性能的Web服务器和反向代理服…...

css3+js 画出爱心特效

要使用CSS3和JavaScript绘制爱心特效&#xff0c;可以使用CSS3的动画和过渡效果来创建爱心的形状&#xff0c;并使用JavaScript来控制动画的触发和交互。以下是一个简单的示例代码&#xff1a; HTML: <div class"heart"></div> <button onclick&quo…...

蔚来李斌卖手机:安卓系统,苹果售价,一年一发

‍作者 | Amy 编辑 | 德新 车圈大佬的玩法真让人寻不着套路&#xff01; 苹果的库克和小米的雷布斯&#xff0c;甚至是FF贾老板准备许久&#xff0c;都想分一块新能源车的蛋糕&#xff0c;蔚来李斌却反手进军手机界&#xff0c;从宣布造手机到手机入网仅仅隔了一年。 近期&a…...

0008__浏览器层面缓存 Etag If-None-Match等详解

浏览器层面缓存 Etag & If-None-Match等详解_if-none-match:_shadow_zed的博客-CSDN博客...

Idea 快捷键整理

Idea快捷键和自动代码补全汇总 idea快捷键汇总 Ctrl 快捷键说明Ctrl F在当前文件进行文本查找 &#xff08;必备&#xff09;Ctrl R在当前文件进行文本替换 &#xff08;必备&#xff09;Ctrl Z撤销 &#xff08;必备&#xff09;Ctrl Y删除光标所在行 或 删除选中的行 &am…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言——第一节 充分条件

文章目录 第一节 充分条件假言命题-那么,就,则真题(2013-29)-假言-充分假言-那么,就,则-变形推理真题(2014-44)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后真题(2018-37)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后;-(2)A→…...

LSTM模型

目录 LSTM模型 LSTM结构图 LSTM的核心思想 细胞状态 遗忘门 输入门 输出门 RNN模型 LRNN LSTM模型 什么是LSTM模型 LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LS…...

抢红包小程序

抢红包小程序 红包大战 # urls.pyfrom django.urls import pathfrom . import viewsurlpatterns [ path(login/, views.login, namelogin), path(create_red_packet/, views.create_red_packet, namecreate_red_packet), path(join_red_packet/<int:red_packet_id…...

UVA 10006 埃氏筛法+快速幂

本题目使用费马定理时&#xff0c;我随机定义了10个数字&#xff0c;循环用费马小定理判断&#xff0c;数组中的值不用和我的相同&#xff0c;随机即可。 #include <iostream> using namespace std; typedef unsigned long long ll; bool isPrime[65007]; ll a[10]; voi…...

C++--红黑树

1.什么是红黑树 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&#xff0c;因…...