Android JetPack ViewModel

一、什么是ViewModel?

Android ViewModel在我们使用MVVM开发模式时会经常用到,对我来说就是好用,好维护。

它相对于MVC模式,

一来可以减少Activity层的代码,可以把一些业务逻辑和对数据的交互到ViewModel层去,其次还解决了两个问题:

  • Activity配置更改重建时(比如屏幕旋转)保留数据
  • UI组件(Activity与Fragment、Fragment与Fragment)间实现数据共享。

第一个问题:

在我们某些App的界面,按照业务需求是需要进行屏幕翻转的。所以就会发生activity 重新创建。

当发生配置变更时,系统会重新创建 Activity。为此,系统会调用 onDestroy() 并销毁现有的 Activity 实例。随后,系统会使用 onCreate() 创建一个新实例,并且这个新的 Activity 实例会使用更新后的新配置进行初始化。这也意味着,系统还会使用新配置重新创建界面。
重新创建行为会自动利用与新设备配置相匹配的备用资源来自动重新加载应用,从而帮助它适应新配置。

重新创建过程还会清除您在 Activity 或其包含的 Fragment、View 或其他对象中,以字段形式保留的任何状态。这是因为 Activity 重新创建过程会创建 Activity 和界面的全新实例。此外,之前的旧 Activity 不再可见或不再有效,因此对该 activity 或其所含对象的任何其余引用都已过时。它们会导致 bug、内存泄漏和崩溃。

这时候,不使用VM的情况下只能通过onSaveInstanceState保存数据,当activity重建后再通过onCreateonRestoreInstanceState方法的bundle中取出,但如果数据量较大,数据的序列化和反序列化将产生一定的性能开销。

第二个问题:

不用VM,各个UI组件都要持有共享数据的引用,这会带来两个麻烦,第一,如果新增了共享数据,各个UI组件需要再次声明并初始化新增的共享数据;第二,某个UI组件对共享数据修改,无法直接通知其他UI组件,需手动实现观察者模式。而ViewModel结合LiveData就可以很轻松的实现这一点。

二、ViewModel的使用

1.引入viewmodel(app下的build.gradle)
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
//implementation "android.arch.lifecycle:extensions:1.1.1"
2.创建ViewModel
val viewModel = ViewModelProviders.of(this).get(AndroidViewModel::class.java)
或者
val mainViewModel = ViewModelProvider(this).get(MyViewModel::class.java)

创建流程:

  1. ViewModelStore是存储VM的数据单元,存储结构为Map,Fragment/FragmentActivity持有其引用。(存储数据,在get方法里首先会判断是否已存在该vm)
  2. ViewModelProvider通过get方法创建一个VM,创建之前会先检查ViewModelStore中是否存在,若不存在则通过反射创建一个VM。

三、ViewModel的回收

下面是vm的生命周期官方图,可以看到,它的生命周期算比较长的。当一个activity调用onestroy方法时,正常情况下,会自动走到onClear()方法。

在activity的源码里,可以看到监听到生命周期为销毁时,会去判断是否是更改了配置,如果不是才会去清除

Fragment里稍微深一些:如果因为Activity被嘎调调用Destroy

第一步,看FragementActivity销毁方法://所有的fragment收到销毁的消息

 第二步:FragmentStateManager里(如果fragment的replace方法导致被替换的fragment嘎调也会走到这里来)

viewmodel的生命周期:

4.配置变化的数据保存(其实就是不清除 )

 

VM在Activity因配置变化导致重建时会被保留,从生命周期的角度来说,ViewModel的生命周期可能会长于Activity的生命周期。

所以使用ViewModel时一定要注意,不能让其引用Activity或View,否则可能导致内存泄漏。

四、ViewModel的具体实现

 这儿贴下我在项目中使用ViewModel的代码,因为上面只能说是对他的一个学习。

启屏页面的viewmodel(注意:因为我在这里面引用了activity,可能造成内存泄漏,所以使用了弱引用)

我的splash界面

 使用    private val splashViewModel: AppSplashViewModel by viewModels()声明viewmodel,然后在oncreate下开始倒计时的方法

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

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

相关文章

代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和

文章目录 一、1143.最长公共子序列 思路 二、1035.不相交的线 思路 三.53. 最大子序和 思路 一、1143.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原…

Linux-等保测评部分命令

iptables防御DDOS攻击的设置 防止syn攻击(DDOOS攻击的一种) iptables -I INPUT -p tcp –syn –m limit --limit 1/s -j ACCEPT iptables -I FORWARD –p tcp --syn –m limit --limit 1/s –j ACCEPT防止各种端口扫描 iptables -A FOR…

最小生成树【做题记录】c++(Prim,Kruskal)

目录 Prim算法求最小生成树 【算法思想】 【算法实现】 【数据结构设计】 【算法步骤】 【输入输出】 【代码示例】 Kruskal算法求最小生成树 【算法思想】 判断是否会产生回路的方法 【算法描述】 【图的存储结构】 【输入输出】 【代码示例】 Prim算法求最小生…

AirBnb架构简史

2007 年,布莱恩切斯基 (Brian Chesky) 和乔加比亚 (Joe Gabbia) 搬到了旧金山。他们一边想为自己的创业想法筹集资金,一边又需要支付房租。 碰巧的是,当时城里正要举行一个设计会议,这意味着很多设计师都会寻找住处。他们想出了在…

Java 五种内部类演示及底层原理详解

内部类 什么是内部类 在A类的内部定义B类,B类就被称为内部类 发动机类单独存在没有意义 发动机为独立个体 可以在外部其他类里创建内部类的对象去调用方法 类的五大成员 属性 方法 构造方法 代码块 内部类 内部类的访问特点 内部类可以直接访问外部类的成员&a…

AI手语研究数据集;视频转视频翻译和风格化功能如黏土动画;AI检测猫咪行为;开放源码的AI驱动搜索引擎Perplexica

✨ 1: Prompt2Sign 多语言手语数据集,便捷高效用于手语研究。 Prompt2Sign 是一个全面的多语言手语数据集,旨在通过工具自动获取和处理网络上的手语视频。该数据集具有高效、轻量的特点,旨在减少先前手语数据集的不足之处。该数据集目前包含…

代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费 文章目录 代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费309.最佳买卖股票时机含冷冻期一、两…

AI架构设计7:TGI

这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计。整体基于云原生技术,结合开源领域的LLMOps或者MLOps技术,充分运用低代码构建高性能、高效率和敏捷响应的AI中台。该专栏需要具备一定的计算机基础。 若在某个环节出现卡点,…

员工管理和激励怎么做?试试场景化激励解决方案!

截止到2020年底,中国企业主体数量达3858.3万,同比增速达11.1%。如何留住人才、激励人才以强化人才与企业“黏性”,最大化提升员工的忠诚度与敬业度,成为企业未来人才发展战略的主要方向之一。 一、传统激励方式存在哪些不足 传统的…

香橙派 AIpro初体验

香橙派(Orange Pi)AI Pro开发板是一款高性能的AI开发板,由香橙派联合华为精心打造。香橙派(Orange Pi),作为深圳市迅龙软件有限公司倾力打造的开源产品品牌,致力于向全球个人及企业用户提供卓越…

十五届蓝桥杯国赛模拟(下)

题单详情 - 蓝桥云课 (lanqiao.cn) 填空题: 2360 互质 互质的定义是:两个数最大公约数为1,因此此题利用gcd模板即可AC: #include<iostream> using namespace std; int ans; int gcd(int a,int b){return b?gcd(b,a%b):a; } int main(){for(int i1;i<2020;i) if(g…

C#实现Queue的加锁和解锁

在C#中&#xff0c;可以使用lock语句来对队列进行加锁和解锁&#xff0c;以确保在多线程环境下的线程安全。以下是一个简单的示例&#xff1a; using System; using System.Collections.Generic; using System.Threading;public class ThreadSafeQueue<T> {private read…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件&#xff0c;用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项&#xff0c;用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

Spring 框架中 Bean 的生命周期?

在 Spring 框架中&#xff0c;Bean 的生命周期包括以下几个阶段: 1. 实例化(Instantiation):在这个阶段&#xff0c;Spring将根据配置文件或注解等方式创建Bean实例&#xff0c;并将其存储在容器中。 2. 属性赋值(PopulateProperties):在这个阶段&#xff0c;Spring将会自动将…

人生二选一:央企就业?美国做博士后?—请看她的抉择

一位30岁的女博士&#xff0c;收到国内央企和德国、美国的博士后邀请函&#xff0c;她该如何选择&#xff1f;知识人网小编推荐这篇文章&#xff0c;为大家解开谜题的同时&#xff0c;也给有同样纠结的学者提供一些启迪。 去年12月底的一个晚上&#xff0c;我收到美国一所高校发…

100个 Unity小游戏系列六 -Unity 抽奖游戏专题四 翻卡游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; i < ItemCount; i){GameObject item;if (i 1 < itemParent.childCount){item itemParent…

前端基础入门三大核心之HTML篇:Webpack、Vite、Grunt、Gulp的场景与实战运用

前端基础入门三大核心之HTML篇&#xff1a;Webpack、Vite、Grunt、Gulp的场景与实战运用 一、Webpack&#xff1a;模块打包与优化的集大成者基本概念与作用应用场景实战例 二、Vite&#xff1a;快速开发的现代化构建利器基本概念应用场景实战例 三、Gulp&#xff1a;任务自动化…

护网期间遇到的几个上传bypass waf、edr

1. weblogic部署war的时候 http/1.1 改成http/2绕过waf 其实jar和ear部署应该也可以&#xff0c;但是我没成功。 2. tomcat windows的话部署 1.war变成 1.w/a/r 应该是 1.w\a\r 3. 上传绕过waf filename"x.jsp" 换成 filename x.jsp 还不行把 把ban…

【MySQL精通之路】SQL优化(1)-查询优化(7)-嵌套循环联接

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(6)-索引条件下推-CSDN博客 下一篇&#xff1a; 1.嵌套循环连接算法 一个简单的嵌套循环联接&#xff08;NLJ&#xff09;算法一次从循环中的…

Python解析网页-requests_html

目录 1、什么是requests_html 2、安装与配置 3、快速入门 4、图片下载 1.什么是requests_html requests_html是一个Python库&#xff0c;用于从Web页面中提取数据。 它提供了对HTML内容的解析和处理功能&#xff0c;使您可以轻松地从网页中提取文本、链接、图像和其他元素。…