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代码;



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值