美文网首页
内存不足造成的Static变量回收

内存不足造成的Static变量回收

作者: chenzhengyeah | 来源:发表于2018-07-13 15:01 被阅读0次

    每天都处在被反馈中.....

    今天项目经理,反馈一个问题,我们的健管机通过蓝牙连接尿检测量仪以后,在访问其他的设备时,出现了访问网络错误,提示"请求出错",然后我开始打印日志发现,正常的网络访问网址应该是

    https://mbank.nf1000.com/m/family/getKeytiState.action


    结果,他访问的网址却变成了

    /m/family/getKeytiState.action


    这就说明https://mbank.nf1000.com/通过一系列方法调用变成了"  ",这就很尴尬了,我赶紧看代码,看看哪里出现了问题,修改了变量,

    然后我就发现,https://mbank.nf1000.com/是我们的Apis.HOST_COMMON,也就是我们的网络访问的根地址,

    恩?

    他怎么会被修改那?好奇怪,我把所有应用的地方全部找出来,然后发现没有啊...

    这就尴尬了.....我没有主动修改,但是他却自己改变了值,那就说明系统把他给修改了...但是系统这么会要改变它的值那?然后我就查看应用的内存使用情况

    蓝牙连接后的内存图

    发现,通过蓝牙连接尿检检测仪时,系统内存不足,然后GC回收,可能在回收的过程中,把我的Apis.HOST_COMMON静态变量回收了,所以我进行了如下操作:

    //通过SP将他们保存到本地,做数据的持久化,

    PreferenceHelper.remove("UrineTestResultActivitty.HostApi");

    PreferenceHelper.putString("UrineTestResultActivitty.HostApi", Apis.HOST_COMMON);

    //页面销毁时

    @Override protected void onDestroy() {

        super.onDestroy();

         String HOST_COMMON = PreferenceHelper.getString("UrineTestResultActivitty.HostApi", Apis.HOST_COMMON);

           Apis.HOST_COMMON= HOST_COMMON ;

     }


    然后,问题解决了,但是我不禁,陷入了沉思..

    用Static变量保存数据是不可靠的,我们尽量避免,或者做一些数据持久化,那么如何替代他那...简单想了几种

    方法1.针对界面单一,静态变量数量不多,而且不是被很多类所引用,并且这些类引用静态变量的次数不是很频繁,只有手动触发(比如点击某个控件才会用到,而不是后台定时占用)的APP,这种情况下,我们可以利用安卓的两个方法: 

    在下面这个方法保存我们的静态变量:

    @Override

    public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState) {

    super.onSaveInstanceState(outState, outPersistentState);   

    // 数据持久化

       outState.putString("aa", MyActivityManager.aa);

    }

    在下面这个方法恢复我们的静态变量到内存:

    @Override

    public void onRestoreInstanceState (Bundle savedInstanceState, PersistableBundle persistentState) {super.onRestoreInstanceState(savedInstanceState, persistentState);   

    //恢复数据

    MyActivityManager.aa=savedInstanceState.getString("aa");

    }

    方法2:针对个别数据,适合一些简单的应用次数较少的数据(String字符串,Int值),可以将要用Static变量保存的数据,保存到sharedpreferences中

    方法3:将静态变量放在Application类中,在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所.当应用再次去调用静态属性或对象的时候,就会造成null pointer异常.Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常

    相关文章

      网友评论

          本文标题:内存不足造成的Static变量回收

          本文链接:https://www.haomeiwen.com/subject/zyvjpftx.html