Android Handler内存泄漏和解决方法

博客主要介绍了Android中Handler内存泄漏的相关内容。阐述了其内存泄漏的原因,即非静态内部类Handler持有外部Activity引用,Activity结束时无法回收。还列举了几种泄漏情况,如隐式引用等,并给出解决方法,如用static修饰、添加弱引用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Handler内存泄漏原因

handler发送的消息在当前handler的消息队列中,如果此时activity finish掉了,那么消息队列的消息依旧会由handler进行处理,若此时handler声明为内部类(非静态内部类),我们知道内部类天然持有外部类的实例引用,那么就会导致activity无法回收,进而导致activity泄露。

二、Handler内存泄漏几种情况
1、隐式引用

public class CameraVerifyActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    private class MyHandle extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    }
}

2、显示引用

public class CameraVerifyActivity extends Activity {
    MyHandle myHandler;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myHandle = new MyHandle(this);
    }
    
    private class MyHandle extends Handler {

        public MyHandle(Activity activity) {
        }
        
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    }
}

3、Handle调用Runnable

public class CameraVerifyActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    class MyRunnable implements Runnable {
        private View view;
        public MyRunnable(View view) {
            this.view = view;
        }
        public void run() {
            // ... do something with the view
        }
    }
}

三、Handler内存泄漏解决方法

1、针对1(添加static):

public class CameraVerifyActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    private static class MyHandle extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    }
}

2、针对2(添加弱引用):

public class CameraVerifyActivity extends Activity {
    MyHandle myHandler;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myHandle = new MyHandle(this);
    }
    
    private static class MyHandle extends Handler {

        private WeakReference<CameraVerifyActivity> reference;


        MyHandle(CameraVerifyActivity activity) {
            reference = new WeakReference<CameraVerifyActivity>(activity);
        }
        
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    }
}

3、同2一样

四、Handler内存泄漏总结

1.使用static 修饰的handler,但是一般会弱引用activity对象,因为要使用activity对象中的成员
2.单独定义handler,同样可以弱引用activity
3.使用内部类的handler,在onDestroy方法中removeCallbacksAndMessages
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值