Android 解决handler内存泄露的方法
  HvTJUzsxOBtS 2023年11月25日 45 0



文章目录

  • 1、简介
  • 2、方法一避免Handler 泄露
  • 3、方法二添加弱连接


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造成内存泄露的分析和解决


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   34   0   0 ideciciMaxideMax
HvTJUzsxOBtS