欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 解决handler内存泄露的方法

程序员文章站 2022-07-14 18:38:25
...

1、简介

大体理解为:
Handler 在使用的时候一般要依附于一个对象,很多时候 handler 延时发送的时候 ,所依附的对象得不到释放,于是出现了 handler 泄露。

2、方法一避免Handler 泄露

1)在对象被销毁的时候 断掉与Handler 的联系,销毁Handler 消息的处理。

@Override
public void onDestroy() {
    // 移除所有的handler 消息.
    mHandler.removeCallbacksAndMessages(null);
}

removeCallbacks(Runnable r)和removeMessages(int what) 可以删除制定的 message

3、方法二添加弱连接

静态类不持有外部类的对象,所以你的Activity可以随意被回收,同时添加handler 和 对象之间的弱引用 代码如下:

/**
 * 
 * 实现的主要功能。
 * 
 * @version 1.0.0
 * @author Abay Zhuang <br/>
 *         Create at 2014-7-28
 */
public class HandlerActivity2 extends Activity {

    private static final int MESSAGE_1 = 1;
    private static final int MESSAGE_2 = 2;
    private static final int MESSAGE_3 = 3;
    private final Handler mHandler = new MyHandler(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler.sendMessageDelayed(Message.obtain(), 60000);

        // just finish this activity
        finish();
    }

    public void todo() {
    };

    private static class MyHandler extends Handler {
        private final WeakReference<HandlerActivity2> mActivity;

        public MyHandler(HandlerActivity2 activity) {
            mActivity = new WeakReference<HandlerActivity2>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            System.out.println(msg);
            if (mActivity.get() == null) {
                return;
            }
            mActivity.get().todo();
        }
    }

文件参考:

Android中使用Handler造成内存泄露的分析和解决
https://blog.csdn.net/jdsjlzx/article/details/51386440