表现层框架设计之表现层设计模式_3.MVVM模式

news2024/11/16 13:00:32

1.MVVM模式 

        MVVM模式正是为解决MVP中UI种类变多,接口也会不断增加的问题而提出的。

        MVVM模式全称是模型-视图-视图模型(Model-View-ViewModel),它和MVC、MVP类似,主要目的都是为了实现视图和模型的分离,不同的是MVVM中,View与Model的交互通过ViewModel来实现。ViewModel是MVVM的核心,它通过DataBinding实现View与Model之间的双向绑定,其内容包括数据状态处理、数据绑定及数据转换。例如,View中某处的状态和Model中某部分数据绑定在一起,这部分数据一旦变更将会反映到View层。而这个机制通过ViewModel来实现。

2.MVVM流程设计

         ViewModel,即视图模型,是一个专门用于数据转换的控制器,它可以把对象信息转换为视图信息,将命令从视图携带到对象。它通过View发布对象的公共数据,同时向视图提供数据和方法。View和ViewModel之间使用DataBinding及其事件进行通信。View的用户接口事件仍然由View自身处理,并把相关事件映射到ViewModel,以实现View中的对象与视图模型内容的同步,且可通过双向数据绑定进行更新。因此,程序员只需编写包含声明绑定的视图模版,以及ViewModel中的数据变更逻辑,就能使View获得响应式的更新。MVVM流程设计如图1所示。

3.MVVM适用场景

         在MVVM模式下View和Model不能直接通信,两者的通信只能通过ViewModel来实现。ViewModel通常要实现一个观察者,当数据发生变化,ViewModel能够监听到数据的变化,然后通知对应的视图做自动更新;而当用户操作视图,ViewModel也能监听到视图的变化,再通知数据做改动,从而形成数据的双向绑定。这使得MVVM更适用于数据驱动的场景,尤其是数据操作特别频繁的场景。

        但也正是由于数据和视图的双向绑定,导致出现问题时不太好定位来源,有可能由数据问题导致、也有可能由业务逻辑中对视图属性的修改导致。若项目中有计划采用MVVM,倾向建议使用官方的架构组件ViewModel、LiveData等去实现MVVM。

        (1)关于ViewModel
        ViewModel类的设计目的是以一种关注生命周期的方式存储和管理与UI相关的数据。
例如:Activity在配置发生改变时(屏幕旋转),Activity就会重新创建,onCreate()方法也会重新调用。我们可以在onSaveInstanceState()方法中保存数据,并从onCreate()方法中通过Bundle恢复数据,但这种方法只适用于可以对其进行序列化的少量数据,而不适用于潜在的大量数据。使用ViewModel的话ViewModel会自动保留之前的数据并给新的Activity或Fragment使用。直到当前Activity被系统销毁时,Framework会调用ViewModel的onCleared()方法,我们可以在onCleared()方法中做一些资源清理操作。

        (2)关于LiveData
        LiveData是一个可观察的数据持有者类。与常见的观察者不同,LiveData是有生命周期感知的。这意味着它尊重其他应用程序组件的生命周期,比如Activity、Fragment或Service。这种感知确保LiveData只更新处于生命周期状态内的应用程序组件。

        LiveData是由observer类表示的观察者视为处于活动状态,如果其生命周期处于STARTED或RESUMED状态。LiveData会将观察者视为活动状态,并通知其数据的变化。LiveData未注册的观察对象以及非活动观察者是不会收到有关更新的通知。

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

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

相关文章

Mac网线连接windows本【局域网互传文件】

Mac网线连接windows本【局域网互传文件】 两台电脑网线互联 Mac->网络->USP TCP/IP 手动配置IP,子网掩码,路由器 windows 网络和Internet配置->更改适配器选项->以太网->Internet协议版本4(TCP/IPv4)->属性 …

概率论统计——大数定律

大数定律 弱大数定律(辛钦大数定律) 利用切比雪夫不等式,证明弱大数定律 应用 伯努利大数定理,(辛钦大数定理的推论) 证明伯努利大数定理 注意:这里将二项分布转化成0,1分布来表示,…

跨境小白shopee被封号的原因?如何有效预防?

提到跨境电商平台,大家都知道亚马逊、Temu、TikTok shop这些是比较大的电商平台。但最近几年,在东南亚市场上,Shopee虾皮却是颇负盛名的一个跨境电商平台,这也让众多中国跨境小白蜂拥而至。目前shopee的商家正在不断增多&#xff…

奥威BI软件能做金蝶ERP以外的数据分析吗?

奥威BI软件能够进行金蝶ERP以外的数据分析。除了金蝶ERP外,奥威BI软件还可以对接用友等主流ERP;支持MS SQL、Oracle、Mysql等主流的关系型数据库,这允许用户直接从这些数据库中导入和分析数据;可以直接上传Excel文件作为数据源。 …

Prompt Engineering Guide

本文转载自:Prompt Engineering Guide https://www.promptingguide.ai/zh/introduction/basics 文章目录 提示工程简介1、基本概念1)基础提示词2)提示词格式 2、提示词要素3、设计提示的通用技巧从简单开始指令具体性避免不精确做还是不做&am…

编译aosp刷入pixel 真机得问题记录

编译aosp要做什么(ubuntu下编译问题相对少) 需要vmware并且已经安装了ubuntu镜像系统 直接切换到root 避免后期避免麻烦 参考地址 https://mp.weixin.qq.com/s/yJp3ijIxykiMmNVYr2V1nQ apt install git //安装git sudo apt install git//给git设置用户…

CDN用户平台安装说明

CDN用户平台安装说明 登录管理员系统 在”系统设置” – “高级设置” – “用户节点”中点击”添加节点” 如果所示: 节点名称 - 可以任意填写 进程监听端口 - 启动用户节点后,进程所监听的端口,通常是HTTP 80或者HTTPS 443,…

Django中使用Celery(通用方案、官方方案)

Django中使用Celery(通用方案、官方方案) 目录 Django中使用Celery(通用方案、官方方案)通用方案场景前置准备完整代码 Celery官方方案【1】注册celery配置【2】创建celery文件【3】init注册【4】添加任务【5】启动worker异步任务…

网络协议——Modbus-TCP

目录 1、简介 2、Modbus-TCP与Modbus-RTU的区别 3、消息格式 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-TCP(Modbus Transmission Control Protocol)是一…

clickhouse 中的数组(array)和元组(Tuple)—— clickhouse 基础篇(二)

文章目录 数组判断是否为空计算数组长度获取数组元素判断某个元素是否存在数组切片数组元素展开数组元素去重删除连续重复元素连接多个数组数组倒序数组拍平数组元素映射数组元素过滤数组聚合分析计算数组交集计算数组并集计算数组差集SQL 子查询进行集合操作 元组创建元组获取…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发,包括查看我的心情列表, 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入,然后配置项目的结构,包括jdk,库,模块,项目,工件…

【NumPy】关于numpy.arange()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Autodesk Maya 2025软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! Autodesk Maya 2025是一款领先的三维动画设计软件,界面直观且功能丰富。它集成了全球领先的3D设计技术,提供了多种创意功能&a…

【安装配置】WSL虚拟机导出、导入镜像(涉及到docker无法在wsl下使用的问题)

背景 WSL(Windows Subsystem Linux),是微软提供的在Windows下便携地使用Linux系统的方式,它支持使用虚拟化技术(也就是要在bios和控制面板中开启虚拟化支持),完美支持Ubuntu和Windows文件系统之…

【Linux取经路】线程安全和死锁

文章目录 一、线程安全1.1 常见的线程不安全情况1.2 常见的线程安全情况1.3 常见的不可重入情况1.4 常见可重入的情况1.5 可重入与线程安全的联系1.6 可重入与线程安全的区别 二、死锁2.1 死锁的四个必要条件2.2 如何避免产生死锁? 三、结语 一、线程安全 线程安全&…

Qt快速入门到熟练(电子相册项目(一))

经过一段时间的学习,相信大家对QT的基本用法都有所了解,从这篇文章开始,我准备记录一下电子相册的项目的一个学习过程。 实现项目创建功能 对于这个电子相册的项目,我并没有在一开始就把所有可能用到的功能模块去事无巨细的考虑周…

mysql数据库主从复制,搭建从库

1 期望效果 假设我们现在有两个服务器,两个服务器都有数据库,然后我们命名一个叫主数据库(Master),一个叫从数据库(Slave) 数据备份和容灾:通过主从复制,可以将主数据库…

【运维心得】双WAN配置的一个误区

目录 双WAN配置及优势 实际案例 解决之道 最后总结 双WAN配置及优势 什么是双WAN配置,这里就不多赘述,简单的说,首先你要有一台支持双WAN口的路由器,目前大多数企业级路由器都具备了这个功能。甚至有些家用路由器也有此类功能…

.gitignore配置以及解决文件不生效

.gitignore配置 新建.gitignore文件 文件内容如下: ###################################################################### # Build Tools.gradle /build/ !gradle/wrapper/gradle-wrapper.jarnbsdk/ logs/target/ !.mvn/wrapper/maven-wrapper.jar##########…

notepad++ 批量转所有文件编码格式为UTF-8

1、安装notepad及PythonScript_3.0.18.0插件 建议两者都保持默认路径安装x64版本: 阿里云盘分享https://www.alipan.com/s/xVUDpY8v5QL安装好后如下图: 2、new Script,新建脚本,文件名为ConvertEncoding 3、自动打开脚本&#xff…