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


版权声明:本文为xMobile原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xMobile/article/details/8904156