今天遇到了一个奇葩问题,进一个需要定位的Activity,定位后调用一次指定接口,接着我就发现,每退出再进入一次该Activity,接口调用次数就增加,唉,不断调试后,发现问题不奇葩,是我犯了二……留念一下,^_^
public class NearActivity extends Activity implements Observer{
private LBS mLBS;
private boolean isRequesting = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_near_list);
mLBS = LBS.getInstance(this);
mLBS.registerObserever(this);
initUI();
locateAndRequest();
}
private void locateAndRequest() {
mLBS.locating(true);
}
private void initUI() {
//初始化界面
}
@Override
public void onFailed(String msg) {
isRequesting = false;
}
@Override
public void onSuccess(Response response) {
isRequesting = false;
}
@Override
public void update(Observable observable, Object result) {
if(isRequesting) {
//TODO 注意这里,这一句无法执行
return;
}
isRequesting = true;
sendRequest();
}
}
主要逻辑就是上面这样的,表现就是退出该Activity,再进来,定位后的请求会走多次,也就是isRequesting这个变量一直都是false,这让我百思不得其解,打印了进程id、线程id都是正常的。为啥就不行呢!
接着我就把isRequesting改为volatile,还是解决不了问题。改为static,好了,这里值是true了,不过结果回来,界面上一点数据都没有。不过总算是找到原因了,对吧?那个奇葩的原因就是——他丫丫的我没有释放内存,这个Acvitivity被单例类LBS引用,所以每次定位结果回来都会通知所有的观察者(也就是这个activity的多个示例)刷新界面。222222222
解决方法:
@Override
protected void onDestroy() {
super.onDestroy();
if(null != mLBS) {
mLBS.unRegisterObserever(this);
mLBS = null;
}
//TODO 其他释放逻辑
}
千万不要小瞧哪怕是最简单的一个界面实现,我实现的时候脑袋是闪过释放内存的,最后想想,这么简单的界面不释放也不会对内存造成什么影响,就忽略了。代价明显是高昂的,切记切记!