奇葩开发问题总结(内存释放)

今天遇到了一个奇葩问题,进一个需要定位的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 其他释放逻辑
    }
千万不要小瞧哪怕是最简单的一个界面实现,我实现的时候脑袋是闪过释放内存的,最后想想,这么简单的界面不释放也不会对内存造成什么影响,就忽略了。代价明显是高昂的,切记切记!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值