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

众所周知,在android应用中,Application的生命周期是和整个应用一致的,只要应用没有被系统回收,这个Application对象就会一直存在。

在实际的开发过程中,我们经常要保存很多的临时数据,比如:某些可以被多个界面共同编辑的变量。这时,我们就会想:我能不能在某个地方保存这个变量,使我这个变量能被所有界面访问。相信你应经猜到了:使用Application。

但是

这个Application对象并不是始终在内存中的,它有可能会由于系统内存不足而被回收。但Android在你重新打开这个应用时并不是重新开始启动这个应用,它会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个app从来没有被kill掉的假象。

这样,你之前缓存的数据都会重新初始化!!!这个问题是非常严重的。

并不仅仅只有Application对象是这样的,其它的单例或者公有静态类也有可能会由于系统内存而被杀掉

怎么测试

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

8c08080220f1

Terminate Application.png

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

发现

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

方案

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值