android handler 内存泄露

来源:互联网 发布:危机公关 知乎 编辑:程序博客网 时间:2024/06/05 23:02

一.通常写法

Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
tv.setText(msg.what + "");
System.out.println(msg.what + "");
sendEmptyMessageDelayed(msg.what - 1, 1000);

};
};

IDE会提示你This Handler class should be static or leaks might occur,意思是说这种写法可能会导致外部类(通常是activity)内存泄露,应该改成static类型的

泄露原因:消息队列会持有handler对象的引用,handler会持有外部类的强引用,导致外部activity无法被回收

实测:关闭handler所在的activity,打印代码依旧在执行;手动调用GC,打印代码依旧在执行


二.优化写法

static class TimerLoginHandler extends Handler {

WeakReference<OtherActivity> mActivity;


TimerLoginHandler(OtherActivity activity) {
                mActivity = new WeakReference<OtherActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
        if (mActivity != null || mActivity.get() != null) {
        mActivity.get().tv.setText(msg.what + "s");
        System.out.println(msg.what + "");
sendEmptyMessageDelayed(msg.what - 1, 1000);
}
        }
}

原理:handler持有外部类的弱引用,GC时不管内存够不够都会回收对象

实测:关闭handler所在的activity,打印代码依旧在执行;手动调用GC报空指针异常,打印代码停止在执行。



0 0
原创粉丝点击