static 带来的奇怪的bug

来源:互联网 发布:unity3d导航系统 编辑:程序博客网 时间:2024/05/22 07:02

原来的网址:http://www.2cto.com/kf/201305/209445.html



大家都知道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代码;

0 0
原创粉丝点击