(十九) 探索static变量在Android应用中的生命周期

前言:最近做项目和code review,都遇到了static变量造成的内存泄露问题,另外我理解static变量会一直存在某个地方占着内存,所以可以不加static的尽量不加,但没什么依据,就想着写个例子大概描述下static在Android应用中的生命周期。


demo地址:我的github


1. demo

写个简单的demo,两个activity共持有一个static变量,然后对其进行++操作,来回切换两个activity

测试:

1)static变量何时被加载?

2)static变量是否可以被共享?

3)static变量何时被销毁?

操作步骤:(有3个activity,分别为activity1,activity2,activity3, 其中activity3没有对static的引用)

1) activity1初始界面,点击add(对static变量进行加一操作)×2,点击跳转到activity2,finish自己

2) activity2界面,点击add(对static变量进行加一操作)×2,点击跳转到activity3,finish自己

3) activity3界面,不对static进行任何操作,点击跳转到activity1,finish自己


2.  实验结果



3. 推断

测试:

1)static变量何时被加载?

2)static变量是否可以被共享?

2) static变量何时被销毁?

推断:

1)类的static变量是类被第一次调用的时候加载(这样很合理,不然很多static变量一开始就占着内存很不好)

2)static变量可以在不同activity中共享,并分别操作,因此有可能有同步问题。

3)static变量在退出程序后再进值就变成初始的了,应该是程序退出后会清除。(特意测试了两个引用过static变量的activity finish后是否static仍缓存着)

引申:如果static变量持有一个activity的context, 那么除非应用被杀,否则这个activity会一直得不到回收,造成内存泄露。static变量实在要持有Context,ApplicationContext更适合它,生命周期看起来是对应的。

PS: 也许例子比较粗糙,不能完全证明以上结论,但好歹是有个实际印象了=-=Think in java好像有专门的介绍,什么时候看一下。


4. static内部类呢?

自己测试对static内部类的static成员变量仍然适用。

4.1 static内部类的static变量

哇,有个单例模式就是用静态内部类的静态成员变量只初始化一次保证了单例的实现。


4.2 static内部类的普通变量

调用不到,提示非静态变量不能被静态的context调用,emmmm


猜你喜欢

转载自blog.csdn.net/sinat_20059415/article/details/79747421