今天遇到了一个奇葩问题,进一个需要定位的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(); } }
接着我就把isRequesting改为volatile,还是解决不了问题。改为static,好了,这里值是true了,不过结果回来,界面上一点数据都没有。不过总算是找到原因了,对吧?那个奇葩的原因就是——他丫丫的我没有释放内存,这个Acvitivity被单例类LBS引用,所以每次定位结果回来都会通知所有的观察者(也就是这个activity的多个示例)刷新界面。222222222
解决方法:
@Override protected void onDestroy() { super.onDestroy(); if(null != mLBS) { mLBS.unRegisterObserever(this); mLBS = null; } //TODO 其他释放逻辑 }千万不要小瞧哪怕是最简单的一个界面实现,我实现的时候脑袋是闪过释放内存的,最后想想,这么简单的界面不释放也不会对内存造成什么影响,就忽略了。代价明显是高昂的,切记切记!