不要在Android的Application对象中缓存数据

android往Application缓存数据的弊端和解决小demo 立即下载

虽然

  • 众所周知,在android应用中,Application的生命周期是和整个应用一致的,只要应用没有被系统回收,这个Application对象就会一直存在。
  • 在实际的开发过程中,我们经常要保存很多的临时数据,比如:某些可以被多个界面共同编辑的变量。这时,我们就会想:我能不能在某个地方保存这个变量,使我这个变量能被所有界面访问。对,聪明的你应经猜到了:使用Application。

但是

这个Application对象并不是始终在内存中的,它有可能会由于系统内存不足而被回收。但Android在你重新打开这个应用时并不是重新开始启动这个应用,它会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个app从来没有被kill掉的假象。
* 这样,你之前缓存的数据都会重新初始化!!!这个问题是非常严重的。
* 并不仅仅只有Application对象是这样的,其它的单例或者公有静态类也有可能会由于系统内存而被杀掉

怎么测试

1.在android studio上,你可以通过Terminate Application来结束当前应用:

Terminate  Application.png

2.也可以通过切换系统语言来达到”重启”Application的目的

发现

测试过程也发现,应用被系统回收后,再次进入应用时,会尝试恢复本来的界面,比如:原来界面有一个EditText,系统在回收应用时会保存里面的文字,在恢复的时候重置设置给EditText。

方案

为了避免应用被系统回收后再次回到应用恢复应用时出现的一系列问题(如Fragment未add无法使用getString等方法、重新恢复EditText触发焦点变化等),通常在自定义的Application类中实现Thread.UncaughtExceptionHandler接口,在它的uncaughtException方法中进行界面的跳转(由于是在Application类中,所以这里的跳转是打开一个界面而已,通常是应用的主界面),并kill掉之前的程序,这样所有的资源都会随着用户的构造而重新生成。

人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作 在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。 阅读详情

相关推荐

告别第三方插件:官方Fused Library如何重塑Android库的合并与发布流程

本文详细介绍了Android官方推出的Fused Library如何替代第三方fat-aar插件,优化Android库的合并与发布流程。通过原生支持、智能依赖管理等优势,Fused Library解决了版本兼容性、依赖传递等核心痛点,提供了更稳定高效的开发体验。文章还提供了迁移实操指南和工程实践建议,帮助开发者顺利过渡到官方方案。

weixin_42561040的博客 257

不要在Android的Application对象里存储数据

在一个App里面总有一些数据需要在多个地方用到。这些数据可能是一个 session token,一次费时计算的结果等。通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储里面。有人建议将这些数据保存到 Application 对象里面,这样这些数据对所有应用内的activities可用。这种方法简单,优雅而且……完全扯淡。假设把你的数据都保存到Application对象

hello_1s的博客 738

UE5笔记【十二】蓝图函数BluePrint Function

蓝图函数BluePrint Function。蓝图类。蓝图变量。

xiaoyaolangwj的博客 4393

android对象缓存,不要在Android的Application对象中缓存数据!

说明这是翻译老外的一篇文章,我之前有遇到过这个问题,并且看到有人在Segmentfault上问,最主要我在StackOverflow上居然没搜到累死问题,所以觉得有必要翻译过来以便后面不会再这样处理。前言在你的App中的很多地方都需要使用到数据信息,它可能是一个session token,一次费时计算的结果等等,通常为了避免Activity之间传递数据的开销,会将这些数据通过持久化来存储。有人建议...

weixin_33725576的博客 256

重带电粒子的能量歧离(energy straggling)

能量歧离,Bethe-Bloch

G751888629的博客 2298

从零开始:手把手教你做转录组与代谢组的联合分析(含R代码)

本文详细介绍了转录组与代谢组联合分析的全流程,包括数据准备、预处理、差异分析及可视化方法,并提供了实用的R代码示例。通过多组学整合分析,研究者可以更全面地理解生物过程,适用于疾病机制和药物开发等医学研究领域。

weixin_29306317的博客 438

【Android】不要在Application对象中缓存数据!

说明   这是翻译老外的一篇文章,我之前有遇到过这个问题,并且看到有人在Segmentfault上问,最主要我在StackOverflow上居然没搜到累死问题,所以觉得有必要翻译过来以便后面不会再这样处理。 前言   在你的App中的很多地方都需要使用到数据信息,它可能是一个session token,一次费时计算的结果等等,通常为了避免Activity之间传递数据的开销,会将这

u011494050的专栏 876

solidworks实体显示线框

solidworks实体莫名其妙显示为有点虚的线框

qq_35858902的博客 1万+

【安卓开发】为什么不能往Android的Application对象里存储数据

在一个App里面总有一些数据需要在多个地方用到。这些数据可能是一个 session token,一次费时计算的结果等。通常为了避免activity之间传递对象的开销,这些数据一般都会保存到持久化存储里面。有人建议将这些数据保存到Application对象里面,这样这些数据对所有应用内的activities可用。这种方法简单,优雅而且……完全扯淡。假设把你的数据都保存到Applicatio...

weixin_30379973的博客 167

AI与运筹学赋能:混合动力公交调度优化算法实战解析

组合优化是运筹学与计算机科学交叉的核心领域,旨在从海量可行方案中寻找最优解,其原理在于通过定义目标函数与约束条件,将复杂现实问题转化为可计算的数学模型。该技术的核心价值在于解决资源受限下的高效分配问题,广泛应用于物流、交通、生产调度等场景。在智慧交通领域,混合动力公交车辆调度正是一个典型的组合优化问题,涉及车辆、班次、充电桩等多重资源与时空约束。本文聚焦于通过贪婪启发式与模拟退火元启发式算法,求解大规模公交网络下的车辆调度与能耗优化方案,旨在实现总能源成本最小化。其中,模拟退火算法通过引入概率性接受劣解的策

weixin_42497762的博客 406

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 348

不要在Android的Application对象中缓存数据!

说明   这是翻译老外的一篇文章,我之前有遇到过这个问题,并且看到有人在Segmentfault上问,最主要我在StackOverflow上居然没搜到累死问题,所以觉得有必要翻译过来以便后面不会再这样处理。 前言   在你的App中的很多地方都需要使用到数据信息,它可能是一个session token,一次费时计算的结果等等,通常为了避免Activity之间传递数据的开销,会将这

期待 7230

智能水下机器人设计: 基于MATLAB的水下机器人动力学建模和控制系统设计,包括水下环境感知、路径规划和任务执行等

智能水下机器人是指能够在水下自主完成各种任务的机器人,例如探测、勘察、救援等。它具有广阔的应用前景,可用于海洋环境监测、水下考古、海上作业等领域。基于MATLAB的水下机器人设计可以为科研人员和工程师提供强大的建模和仿真工具,帮助他们设计更智能、更高效的水下机器人。智能水下机器人是未来海洋科技发展的重要方向,它将为海洋科学研究、水下考古和海上作业等领域带来新的机遇。MATLAB是一种功能强大的数学和科学计算软件,它可以为智能水下机器人设计提供强大的工具和支持。

走向CTO的路上... 962

android对象缓存,不要在Android的Application对象中缓存数据

众所周知,在android应用中,Application的生命周期是和整个应用一致的,只要应用没有被系统回收,这个Application对象就会一直存在。在实际的开发过程中,我们经常要保存很多的临时数据,比如:某些可以被多个界面共同编辑的变量。这时,我们就会想:我能不能在某个地方保存这个变量,使我这个变量能被所有界面访问。相信你应经猜到了:使用Application。但是这个Application...

weixin_39997400的博客 225

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

千万不要在Android的Application对象中缓存数据!

前言  在你的App中的很多地方都需要使用到数据信息,它可能是一个session token,一次费时计算的结果等等,通常为了避免Activity之间传递数据的开销,会将这些数据通过持久化来存储。  有人建议将这些数据放在Application对象中方便所有的Activity访问,这个解决方案简单、优雅并且是……完全错误的。  你如果你将数据缓存到Application对象中,那么有可能你的程序最终

Jage的博客 3768

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android中的Application对象里尽量不要存储数据

问题: 在做一个项目的时候需要将登陆后后台返回的数据进行保存,然后再其他地方调用。 解决方案: 公司中的一个员工是这样处理的 在MyApplication中定义了一个User user = new User();(保存数据的对象),然后再获取到数据的时候,将获取到的数据直接赋值给这个对象(MyApplication.user = userTest;)然后在其他地方用的时候就

doubles的博客 4139

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 重写Activity等Android组件构造函数的那些坑
下一篇: android相机权限适配遇到的坑(包含6.0和6.0以下)
android_cyw
博客等级 码龄11年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值