每天都处在被反馈中.....
今天项目经理,反馈一个问题,我们的健管机通过蓝牙连接尿检测量仪以后,在访问其他的设备时,出现了访问网络错误,提示"请求出错",然后我开始打印日志发现,正常的网络访问网址应该是
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异常
网友评论