最近发现Android的APP一直出问题,一直找不到原因。于是,我装上了Bugly进行跟踪。
果然,跟踪到一个奇怪的异常,异常显示一个static变量为一个非常奇异的值。
第一眼感觉很奇怪,在笔者的印象中,static为静态变量,是一个全局数据,不应该为异常值,非常困惑。
于是,继续学习相关资料,了多篇博客介绍android的static的变量存在陷阱的。文章链接如下:
[2]为何Android开发中不推荐使用static全局变量传参_修的专栏-CSDN博客
[3]【Android】static静态变量的生命周期——静态之坑_欢迎来到 @花城 的博客-CSDN博客_android static变量生命
[4]Android-static关键字开发注意细节 - 简书
[6]Android static object lifecycle - Stack Overflow
这些博客大致得出如下结论:
1)static确实是静态全局变量;
2)但Android的static变量的奇妙之处是,static变量在类里,是通过类加载和释放的;
3)Android对于不活跃的类变量(如后台运行的类),会放到不活跃区,如果内存不足会释放掉相关变量;当变量需要时,或者切换到前台时,会重新加载相关类,从而重新加载static变量;
4)这会造成全局变量不是全局生命周期的,从而造成某些static变量调用的时候为异常值。
解决方案为:
1)使用SharedPreferences;
2)传递临时变量;
3)用startActivity等方法;
4)用sqlite等小型数据库作为存储工具。