静态变量的陷阱
我们都知道,静态变量用起来是挺方便的,可是一不小心那就say拜拜了。说一说我在项目中遇到的情况,测试了好多次,最后才发现原因。感动啊!
private static String UserRootPath = "/sdcard/User/"+UserManager.username;
private static String UserCache=UserRootPath+"/path";
目的:
在一个类中,定义了上面两个静态变量,想要实现不同用户登录创建不同的文件夹,UserManager.username为用户名。
然后就掉进坑了。
情况是这样的:
当我登录一个账号A,确实创建了对应文件夹A,但是注销登录,用另一个账号B再次登陆的时候,却不会再创建文件夹了B。Why,捣鼓了好久,在测试过程中发现登录B后,UserManager确实变为B了,可是UserRootPath却还是原来的那个"/sdcard/User/"+A。
对于静态变量的陷阱我早有耳闻,所以立马反应过来时静态变量出了问题。
原来在关闭activity或者应用之后UserRootPath占用的内存还在,所以再次登录的时候UserRootPath还是原来的值,不会改变,即使这个时候UserManager.username已经发生了改变(创建文件夹的时候在代码中判断该文件夹是否已经存在,因为路径没变,所以判断出来的结果是已经存在,所以就不会再创建了)。事实证明,如果关闭应用后强制kill掉该应用的进程,那么再次登录就不会出现这种情况。
于是我在登陆之后重新给UserRootPath赋值一次。
本来以为解决了,却发现B的子目录没有创建(+_+)。
原来子目录UserCache引用了UserRootPath,类似于上面的情况,由于UserCache也是静态变量,虽然再次登陆之后UserRootPath改变了,但是UserCache还是之前那个(由于没有重新赋值,所以它里面的UserRootPath还是之前那个没有变)
于是我在登陆之后也给UserCache重新赋值一次。
说到最后就是想说以后用静态变量的时候记得更新变量的值,尤其是静态变量引用了另一个变量的时候,仅仅改变那个被引用的变量是不行的,还要把静态变量的值也更新了。(因为静态变量什么时候被回收具有不确定性)。