不要在Android的Application对象中缓存数据
2016-11-03 本文已影响1686人
android_cyw
- 众所周知,在android应用中,Application的生命周期是和整个应用一致的,只要应用没有被系统回收,这个Application对象就会一直存在。
- 在实际的开发过程中,我们经常要保存很多的临时数据,比如:某些可以被多个界面共同编辑的变量。这时,我们就会想:我能不能在某个地方保存这个变量,使我这个变量能被所有界面访问。相信你应经猜到了:使用Application。
但是
这个Application对象并不是始终在内存中的,它有可能会由于系统内存不足而被回收。但Android在你重新打开这个应用时并不是重新开始启动这个应用,它会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个app从来没有被kill掉的假象。
- 这样,你之前缓存的数据都会重新初始化!!!这个问题是非常严重的。
- 并不仅仅只有Application对象是这样的,其它的单例或者公有静态类也有可能会由于系统内存而被杀掉
怎么测试
1.在android studio上,你可以通过Terminate Application来回收当前应用:
Terminate Application.png2.也可以通过切换系统语言来达到"重启"Application的目的
发现
测试过程也发现,应用被系统回收后,再次进入应用时,会尝试恢复本来的界面,比如:原来界面有一个EditText,系统在回收应用时会保存里面的文字,在恢复的时候重置设置给EditText。
方案
为了避免应用被系统回收后再次回到应用恢复应用时出现的一系列问题(如Fragment未add无法使用getString等方法、重新恢复EditText触发焦点变化等),通常在自定义的Application类中实现Thread.UncaughtExceptionHandler接口,在它的uncaughtException方法中进行界面的跳转(由于是在Application类中,所以这里的跳转是打开一个界面而已,通常是应用的主界面),并kill掉之前的程序,这样所有的资源都会随着用户的构造而重新生成。