博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态变量的陷阱
阅读量:6947 次
发布时间:2019-06-27

本文共 1029 字,大约阅读时间需要 3 分钟。

我们都知道,静态变量用起来是挺方便的,可是一不小心那就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重新赋值一次

 

 说到最后就是想说以后用静态变量的时候记得更新变量的值,尤其是静态变量引用了另一个变量的时候,仅仅改变那个被引用的变量是不行的,还要把静态变量的值也更新了。(因为静态变量什么时候被回收具有不确定性)。

 

转载于:https://www.cnblogs.com/tangZH/p/6181722.html

你可能感兴趣的文章
CSDN日报20170411 ——《怎样给自己的私活项目标价》
查看>>
(转)背包9讲
查看>>
Linux_window与linux之间文件互传,上传下载
查看>>
GDB调试——常用的命令
查看>>
Disruptor多个消费者不重复处理生产者发送过来的消息
查看>>
vuejs_01项目启动
查看>>
[LeetCode] Candy Crush 糖果消消乐
查看>>
04.变量和常量
查看>>
图像采集调试总结
查看>>
iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤
查看>>
1111111
查看>>
XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法...
查看>>
弱符号与强符号,弱引用与强引用
查看>>
009PHP文件处理——文件处理 file_get_contents file_put_contents fgetc fgets fgetss
查看>>
spring boot项目在外部tomcat环境下部署
查看>>
基于C#在Mongodb的Skip-Limit和Where-Limit的分页对比 并且含mongodb帮助类的源码
查看>>
060——VUE中vue-router之路由嵌套在文章系统中的使用方法:
查看>>
tenda某路由器信息泄露查找
查看>>
uva 10710 - Chinese Shuffle(完美洗牌)
查看>>
怎么清除火狐浏览器的cookie?
查看>>