其他分享
首页 > 其他分享> > Android静态变量引起的NPE

Android静态变量引起的NPE

作者:互联网

1、静态变量的优势

静态变量位于虚拟机的方法区,静态变量是在类被load的时候分配内存的。当类被卸载的时候才会被销毁。

2、静态变量的npe

明确一件事,app不是只有在内存不足的情况下被回收,其实当应用被切换成后台的时候长久没使用,也会被系统回收的。比如在应用A页面中突然接到一个电话,在接完电话的时候,应用很可能已经被回收了,此时再次进入A页面时,是系统重新创建的,Application也可能会被重新创建。所以保存在Application、Activity、静态变量都可能为空了。其实Application被回收相当于APP重新打开了,只是页面A被系统记住了,切换前台时是优先显示APP的页面A。

与上述情况相对的是,不能把退出所有的Activity等同于进程的退出。用户点击图标启动应用的时候,以前存放于静态变量的值,大概率还在。这点尤其要注意。

网上有帖子:

关闭一个Activity的时候,由这个Activity初始化的静态变量也会被置空,因此静态变量的生命周期不稳定。

这句话是错误的。事实上,静态变量是伴随APP的生命周期的。如果静态变量为空了,可以肯定APP也是被后台回收了。

3、Activity的静态变量

APP如果被系统回收了,由后台切前台进入的某个页面C时,此时Application和该Activity都会重新创建。幸运的是android系统给了用户保存数据的机会,我们可以利用方法onSaveInstanceState存储数据在系统进程,会为我们保存优先的几个小时,但时间长了一样会被回收掉,这个可以理解,长时间不使用,相当于用户重新打开APP。

4、Application的NPE

和上面说的有点重复,Application也是单例对象,当进程被杀掉会被回收,只不过Android系统会帮重建Application,所有保存在Application的全局变量也就为空了,但系统一定会调用onCreate()方法。

5、低内存时出现的问题

可以监听系统的内存回收状态,发现进程快被杀死时,可以自己手动杀死进程,不给系统机会。简单说说这两种区别:

低内存系统杀死时,在次进入APP会进入离开时的页面,和打电话造成后台进程被回收相似,调用方法onTrimMemory/onLowMemory();

低内存自己手动杀死时,APP相当于重新打开。

低内存有以下几个级别:

在这里插入图片描述

TRIM_MEMORY_COMPLETE这个监听的时候有时候监听不到,建议监听TRIM_MEMORY_MODERATE,在这个里面处理退出程序操作。

6、Application使用场景

从Application类的方法中可以看到,Application类的应用场景有:(已按优先级排序):

1)初始化应用程序级别的资源,如全局对象、环境配置变量等;

2)数据共享、数据缓存,如设置全局共享变量、方法等

3)获取应用程序当前的内存使用情况,及时释放资源,从避免被系统杀死

4)监听应用程序配置信息的改变,如屏幕旋转等。

5)监听应用程序内所有Activity的生命周期。

标签:变量,Application,NPE,APP,回收,静态,Activity,Android
来源: https://blog.csdn.net/dsc114/article/details/110949872