Android Activity因配置改变重建,ViewModel#onClear方法为什么不被调用?

news2024/11/24 16:23:56

1,问题

注意到切换语言或字体大小改变时,Activity会发生重建,但对应的ViewModel却不会被clear,甚至在重建的Activity,通过new ViewModelProvider(this).get(ViewModel.class)也是上一个Activity的实例,为什么呢?

上述问题发生的条件是当前Activity需要是ComponentActivity的子类。

2,答案

先来回答问题1,对应的ViewModel为什么不会被clear?

注意到,ComponentActivity实现了ViewModelStore接口,在destroy时,只有isChangingConfigurations返回false,才真正去clear ViewModel。那么说明时候isChangingConfigurations返回true,答案很简单,Activity#recreate时。

再来回答问题2,通过new ViewModelProvider(this).get(ViewModel.class)也是上一个Activity的ViewModel实例,为什么呢?

理解问题的关键是直接查看方法逻辑,

ComponentActivity实现了ViewModelStore接口,笔者根据,

跟进ensureViewModelStore,

注意到,当getLastNonConfigurationInstance返回不为null时,mViewModelStore成员从nc中获取。继续跟进。

关键时mLastNonConfigurationInstances成员,

这个方法怎么在新建的Activity被赋值的呢?

答案是在Activity#attach中,这已是Framework范畴,更近的问题是上一个Activity的ViewModelStore怎么被保存到了mLastNonConfigurationInstances?

这时,需要看下ActivityThread#performDestroyActivity相关。

当销毁上一个Activity因配置问题重建时,getNonConfigInstance为true,这时会回调ActivityretainNonConfigurationInstances方法,

跟进,

笔者跟进到ComponentActivity#onRetainNonConfigurationInstances,

问题的关键就很简单,销毁Activity的mViewModelStore保存到nci中即可。这样,结合上文,重建的Activity就拿到了销毁Activity的viewModelStore,自然创建的ViewModel就是一个实例了。

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

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

相关文章

【精读Yamamoto】方向性连接如何丰富神经网络的功能复杂度 | 体外神经元培养实验 | 脉冲神经元模型(SNN) | 状态转移模型

探索大脑的微观世界:方向性连接如何丰富神经网络的功能复杂度 在神经科学领域,理解大脑如何通过其复杂的网络结构实现高级功能一直是一个核心议题。最近,一项由Nobuaki Monma和Hideaki Yamamoto博士领导的研究为我们提供了新的视角&#xff…

Linux----正则表达式练习题题解

1、 显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行; [rootopenEuler ~]# grep -E "^(H|h)" /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt 注:当然也可以使用grep -i来实现,这里我换了一个文件(/etc/passw…

第240513章 消除Otostudio关于库文件的48个报警

第240513章 消除Otostudio关于库文件的48个报警 文章目录 第240513章 消除Otostudio关于库文件的48个报警前言一、替换Lib_Googol文件夹二、替换扩展模块配置文件三、复制MODBUSTCP库到Lib_Googol文件夹四、替换GTS800和DEFAULT文件五、仿真模拟 前言 一、替换Lib_Googol文件夹…

ARM架构安全特性之通用平台安全服务

安全之安全(security)博客目录导读 目录 一、符合PSA认证标准 二、Arm平台安全规范 三、跨安全边界通信 四、FF-A 五、FF-M 六、开放和标准设备固件 七、Trustedfirmware.org 在一个需要高度信任设备的世界中,每个设备都必须是独一无二的可识别的、不可克隆…

AI“源神”启动!Llama 3发布,开闭源之争战局生变

在AI的世界里,开源与闭源的较量一直是科技界的热门话题。 今年年初,埃隆马斯克在对OpenAI及其CEO萨姆奥特曼提起诉讼时,就对OpenAI逐渐不公开其模型研究相关细节的行为大加谴责。“时至今日,OpenAI公司网站还宣称,它的…

新的语言学习系统: 记忆镶嵌

摘要 记忆镶嵌是由多个关联记忆网络协同工作来完成感兴趣的预测任务。与transformer类似,记忆镶嵌具有组合能力和上下文学习能力。与transformer不同,记忆镶嵌以相对透明的方式实现这些能力。该研究在玩具示例上展示了这些能力,并且还表明记忆镶嵌在中等规模语言建模任务上的表…

PCIE协议-2-事务层规范-Message Request Rules-Vendor_Defined Messages

2.2.8.6 厂商定义消息 厂商定义消息允许扩展PCI Express消息功能,可以作为PCI Express规范的一般扩展,也可以是厂商特定的扩展。本节通用地定义了与这些消息相关的规则。 厂商定义消息(见表2-25)使用图2-28中显示的头标格式。re…

栈队列经典OJ题(详细过程)

1. 有效的括号 - 力扣(LeetCode) 第一题判断有效的括号,这道题我们会用到栈的知识,栈是后进先出的,可以根据这个来解这道题,先看一下题目和示例。 1.1整体思路 我们通过示例可以看出括号匹配就返回true&am…

【STM32 |示例程序】EXTI中断示例程序(对射式红外传感器旋转编码器计次)

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 丠丠64-CSDN博客🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

MinIO学习笔记

MINIO干什么用的: AI数据基础设施的对象存储 为人工智能系统提供数据支持,数据存储;对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本…

Maven、JavaWeb基础开发

1 Maven介绍 1、标准化的项目结构 2、标准化的构建流程 3、依赖管理 4、依赖范围 2 JavaWeb基础开发 2.1 Http协议 1 Http请求数据格式 2 Http响应数据格式 2.2 Web服务器(Tomcat) VTS、FileServer使用Tomcat部署; 其他服务单元TESLA S…

前端使用Compressor.js实现图片压缩上传

前端使用Compressor.js实现图片压缩上传 Compressor.js官方文档 安装 npm install compressorjs使用 在使用ElementUI或者其他UI框架的上传组件时,都会有上传之前的钩子函数,在这个函数中可以拿到原始file,这里我用VantUI的上传做演示 a…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…

大模型管理工具:SWIFT

目录 一、SWIFT 介绍 二、SWIFT 安装 2.0 配置环境(可选) 2.1 使用pip进行安装 2.2 源代码安装 2.3 启动 WEB-UI 三、部署模型 3.0 deploy命令参数 3.1 原始模型 3.2 微调后模型 一、SWIFT 介绍 SWIFT(Scalable lightWeight Infrastructure for Fine-Tuni…

一、VIsual Studio下的Qt环境配置(Visual Studio 2022 + Qt 5.12.10)

一、下载编译器Visual Studio2022和Qt 5.12.10 Visual Studio 2022 社区版就够学习使用了 Qt5.12.10 安装教程网上搜,一大堆 也很简单,配置直接选默认,路径留意一下即可 二、配置环境 Ⅰ,配置Qt环境变量 系统变量下的Path&a…

tomcat 的启动流程

tomcat 的启动流程 中 使用的Lifecycle 生命流程 。在这里还使用了设计模式中的模板模式(LifecycleBase 是一个模板类) init()方法 start() 方法 container 的处理

CNN/TCN/LSTM/BiGRU-Attention到底哪个模型效果最好?注意力机制全家桶来啦!

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍 效果展示 原理简介 代…

MySQL8.0就地升级到MySQL8.4.0

MySQL8.0就地升级到MySQL8.4.0 升级需求:将8.0.35升级到8.4.0,以In-Place方式直接升级到MySQL8.4.0。 数据库版本 操作系统版本 原版本 8.0.35 Centos7.9 x86_64 新版本 8.4.0 Centos7.9 x86_64 关闭现有版本MySQL,将二进制或包替换成新版本并…

小红薯视频作品一键克隆,解放双手自动搬运【永久脚本+使用教程】

软件介绍: 小红薯作品搬运神器,软件只需要复制对方的作品链接即可一键克隆搬运到自己的小红书上,再也不用手动去复制粘贴了,批量起号搬运必备神器 设备需求: 电脑 链接:https://pan.baidu.com/s/11MzBqER…

Automa:一键自动化,网页数据采集与工作流程优化专家

Automa:解锁自动化浏览器潜能,赋能工作效率,让复杂任务变得简单- 精选真开源,释放新价值。 概览 Automa是一款创新的网页自动化工具,专为寻求提升工作效率、简化数据收集过程的现代工作者设计。它融合了先进的数据抓取…