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

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.mzph.cn/pingmian/14490.shtml

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

相关文章

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…

新品:LoRa扩频调制SOC无线模块-内置ARM、工业级晶振

LoRa-STM32WLE5是思为无线最新研发的一款SOC无线模块,模块主芯片采用了ST 公司的STM32WLE5芯片研发。模块采用LoRa调制,内置工业级晶振,并基于高性能的ArmCortex-m4 32位RISC核心,工作频率高达48 MHz。这个核心实现了一套完整的DS…

项目十二:简单的python基础爬虫训练

许久未见,甚是想念,今日好运,为你带好运。ok,废话不多说,希望这门案例能带你直接快速了解并运用。🎁💖 基础流程 第一步:安装需要用到的requests库,命令如下 pip inst…

初始化是什么

定义 初始化(Initialization)是指在计算机科学和软件开发中,将系统、变量、对象或其他可用组件设置为其初始状态或初始值的过程。这通常是在程序开始执行或组件第一次使用之前进行的,以确保其处于可预测和稳定的状态。 初始化的…

844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s "ab#c&quo…

Vue.js组件设计原则

Vue.js组件设计原则主要遵循以下几点,以确保组件的可维护性、可复用性、清晰性和可测试性: 单一职责原则(Single Responsibility Principle, SRP): 每个组件应该只负责一个特定的功能或一组紧密相关的功能。如果一个组…

golang 连接mysql数据库

dbconfigdatastr字符串:用户名:密码tcp(ip:端口)/数据名 连接数据库的那个go文件一定要引用: _ "github.com/go-sql-driver/mysql" import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""lo…

【漏洞复现】智慧校园(安校易)管理系统 FileUpProductupdate.aspx 任意文件上传漏洞

0x01 产品简介 "安校易"是银达云创公司基于多年教育市场信息化建设经验沉淀,经过充分的客户需求调研,并依据国家"十三五”"教育信息化建设规范而推出的综合互联网教育信息化解决方案。“安校易“以物联网技术为基础,以学…

【Python小案例】Python+mysql+PyQt5健康体检报告查询

下载安装Python3.7.8 python官网:https://www.python.org/ PyQt5配置 安装PyQt5 pip install PyQt5pip install qt5_toolspytcharm创建项目 配置外部工具 QTDesigner的Arguments语句不用填 QTDesigner的Working directory语句:$ProjectFileDir$ Pyuic的Argume…

【职场心灵伴侣】文心一言智能体

【文心一言】智能体 写在最前面名称和简介:职场心灵伴侣AI生成头像添加工具智能体调优 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限…

智能农业时代:智能生态网络与数据流通的融合

随着科技的不断进步,智能农业已经成为现代农业发展的重要趋势。智能生态网络(IEN)作为一种集成化的解决方案,通过整合先进技术和数据要素流通,为智能农业的发展提供了强大的动力。在本文中,我们将探讨IEN在…

鸿蒙开发配置官方地图

一共需要配置 p12 p7b cer csr 四个文件 p12文件配置 注意创建文件名必须是.p12 到AGC创建项目 AppGallery Connect 添加自己的项目名称 我没有开启 暂时不需要 看个人需求 下载刚创建的cer证书 回到我的项目中 点击刚创建的项目 点击这里 四个文件齐全了 "metadata&qu…

《正常血压》

描述 监护室每小时测量一次病人的血压,若收缩压在90−140之间并且舒张压在60−90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。 输入描述 第一行为一个正整数n。…

【MySQL精通之路】InnoDB(6)-磁盘结构(5)-Redolog

主博客: 【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客 上一篇: 【MySQL精通之路】InnoDB-双写缓冲区-CSDN博客 下一篇: 目录 1.配置Redo Log容量(MySQL 8.0.30或更高版本) 2.配置重做日志容量(MySQL…

C++初阶之深入模板

一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成…

基于STM32实现智能空气质量监测系统

目录 文章主题环境准备智能空气质量监测系统基础代码示例:实现智能空气质量监测系统 配置传感器并读取数据数据处理与显示数据存储与传输应用场景:室内环境监测与空气质量控制问题解决方案与优化收尾与总结 1. 文章主题 文章主题 本教程将详细介绍如何…

LIO-EKF: High Frequency LiDAR-Inertial Odometry using Extended Kalman Filters

一、论文摘要 里程计估计是每个需要在未知环境中导航的自主系统的关键要素。在现代移动机器人中,3D LiDAR 惯性系统通常用于执行此任务。通过融合 LiDAR 扫描和 IMU 测量,这些系统可以减少因顺序注册各个 LiDAR 扫描而引起的累积漂移,并提供稳…

如何在 Ubuntu 24.04 (桌面版) 上配置静态IP地址 ?

如果你想在你的 Ubuntu 24.04 桌面有一个持久的 IP 地址,那么你必须配置一个静态 IP 地址。当我们安装 Ubuntu 时,默认情况下 DHCP 是启用的,如果网络上可用,它会尝试从 DHCP 服务器获取 IP 地址。 在本文中,我们将向…

登录接口测试

登录接口测试 数据驱动

深度解析:用 Python 爬虫逆向破解 solscan 的请求头加密参数 Sol-Aut

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地逆向分析 solscan 网站请求头加密字段 Sol-Aut 的构造逻辑,…