不要在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掉之前的程序,这样所有的资源都会随着用户的构造而重新生成。

避坑指南:DeepSeek Function calling流式输出中的常见问题与解决方案 本文深入探讨了在DeepSeek Function Calling中实现流式输出时常见的参数拼接、函数依赖管理和错误处理等核心挑战。针对流式响应中参数碎片化的问题,提供了健壮的参数拼接方案与状态管理策略。同时,文章详细阐述了如何管理函数调用顺序、处理条件性执行,并构建了分阶段的错误处理与重试机制,旨在帮助开发者构建稳定、高效的流式AI应用。 阅读详情

相关推荐

linux 驱动 - pinctrl子系统

分析总结 pinctrl 子系统框架结构,平台 mtk6771 内核版本 kernel-4.4 , 本文所有的分析均基于此版本。

sty01z的博客 1557

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

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

hello_1s的博客 738

BK3437蓝牙5.2芯片实战:手把手教你设计超低功耗智能家居遥控器(附原理图)

本文详细介绍了BK3437蓝牙5.2芯片在超低功耗智能家居遥控器设计中的应用。通过分析芯片的核心优势、硬件设计要点和低功耗固件策略,手把手教你实现日均功耗低于5μA的遥控器原型,并附有原理图设计详解和常见问题解决方案。

tgb34567890的博客 620

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

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

weixin_33725576的博客 256

带隙基准电路实战:温度补偿与流片调优全解析

带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架

weixin_42628280的博客 254

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

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

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

u011494050的专栏 876

东方财富网API接口逆向分析:手把手教你破解那个带jQuery回调的股票数据接口

本文详细解析了东方财富网股票数据API接口的逆向工程实战技巧,重点介绍了JSONP接口的核心机制、参数解析及数据处理方法。通过Python代码示例演示了如何构造请求、处理分页数据及应对反爬策略,帮助开发者高效获取股票数据。文章还提供了完整的爬虫实现案例和常见问题排查指南。

weixin_30790841的博客 716

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

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

weixin_30379973的博客 167

DAC8568控制器实战:如何用STM32实现多通道同步输出(附完整代码)

本文详细介绍了如何使用STM32微控制器驱动TI的DAC8568多通道DAC控制器,实现高精度的多通道同步模拟信号输出。内容涵盖硬件设计要点、SPI时序精准配置、驱动层命令构建,并重点解析了通过LDAC引脚实现同步更新的核心策略,提供了完整的代码框架和实战案例,帮助工程师快速解决多通道同步输出的工程难题。

weixin_29179311的博客 171

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用

技能大赛样题解析,caliper题目从0到使用

weixin_52865146的博客 2077

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

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

期待 7230

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期

本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。

weixin_43674738的博客 188

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

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

weixin_39997400的博客 225

计算机控制技术及应用

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

Jage的博客 3768

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

doubles的博客 4139

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 重写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、付费专栏及课程。

余额充值