Android开发之警惕static变量使用
大家都知道static变量有很多好处就是可以在保存全局数据。但是由此可能带来很隐蔽的BUG。
情况:
本人在开发一个项目的时侯有切身的体会,以下这个BUG查找了很久才知道。由于多个人开发的项目。某个同事使用了static预先缓存一些列表数据,方便下个界面使用。该数据保存了一些图片的引用,而这些图片又单独在另外一个列表保存,但是在退出程序的时侯又把这些图片Recycle(回收)了。
现象:
偶尔进入程序出现使用了已回收的图片的问题。
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap
分析:
由于Android架构设计原因,在程序退出时,static数据并没有立即得到清理。在上面的案例中可以发现,当预先加载网络数据比较慢,再进入下一个界面时,发现static变量有数据。这个时侯就使用这个数据就是程序退出时的数据,但该数据引用的图片已回收。就导致前面的现象发生。
解决:
在退出程序时,同时清空static变量里面的数据。
建议:
在开发的过程中,尽量少使用static数据,尽量把static变量集中在一个类。(仅供参考)
延伸:
Android退出程序时,没有把static数据立即清理的验证。
public class TestStatic {
private static int nValue = 0;
static {
nValue += 100;
}
public TestStatic() {
nValue += 300;
Log.i("TestStatic", "nValue:"+nValue);
}
}
结果:
05-09 11:15:04.589: I/TestStatic(8093): nValue:400
05-09 11:15:08.309: I/TestStatic(8093): nValue:700
第一次进入程序时,先执行static代码,再到TestStatic();
第二次进入程序时,直接执行TestStatic(),跳过了static代码;
补充:移动开发 , Android ,