android关于handler的内存泄露

来源:互联网 发布:哥本哈根会议 知乎 编辑:程序博客网 时间:2024/06/16 07:09

通常一个activity中会执行耗时的网络请求,也会用到handler去更新UI,但是当我们刚进入页面,然后就关闭当前页面,子线程或者异步请求并没有执行完,就会导致activity没有被销毁(handler中隐 用了activity,故不会立即被销毁掉),即使使用handler.post去更新UI,handler也会被放入message的队列中去,也会受到引用,而handler中隐用了activity,同样不会被销毁掉。解决如下:

a.在销毁activity生命周期中,去停止子线程的执行,stop

b.倘若用的是异步处理请求,则同样在destroy中去执行异步的.onCancle()方法

c.将handler声明为静态(因为静态不持有外部类的引用),但是handler中却吊用不了activity中的对象了,所以才去弱引用的方式去实现,类似如下:

static class MyHandler extends Handler {
    WeakReference<Activity > mActivityReference;

    MyHandler(Activity activity) {
        mActivityReference= new WeakReference<Activity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        final Activity activity = mActivityReference.get();
        if (activity != null) {
            mImageView.setImageBitmap(mBitmap);
        }
    }
}


0 0
原创粉丝点击