美文网首页
Android - Handler导致的内存泄漏

Android - Handler导致的内存泄漏

作者: xlq | 来源:发表于2018-12-06 00:37 被阅读0次

内存泄漏:没有用的对象,无法被GC垃圾回收,就会造成内存泄漏(OOM)

Handler如果使用不当,极大可能造成内存泄漏。比如:我们一般使用handler的方式,会在主线程中使用匿名类来创建handler:

Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
内存泄漏的原因:
  1. 在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。

  2. 而由于Handler原来,MessageQueue中的Message会对Handler持有引用,而handler会对Activity持有引用,即:
    message -----> handler ----->activity

  3. 所以,当Activity被销毁时,如果MessageQueue中仍然有message没有处理完,就会一直持有对Activity的引用,导致GC无法回收Activity,由此造成内存泄漏。

两种解决方法:
  1. 将Handler定义为静态内部类,提高调用WeakReference来完成handler对Activity的弱引用。GC回收机制规定,当对象被其他对象弱引用时,允许GC对其回收。具体的代码实现:
private static class MyHandler extends Handler{
    private WeakReference<MainActivity> weakReference;
    public MyHandler(MainActivity activity){
        weakReference = new WeakReference<>(activity);
    }
    Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        final Activity activity = weakReference.get();
        if (activity != null) {
            //实现相应逻辑
        }
     }
}
  1. 在Activity被销毁时,将未处理的message全部remove。代码实现:
@Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
    }

这样使用Handler,就不会造成内存泄漏了。

相关文章

  • (转载自diycode)2017 Android 面试题分享整理

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 An...

  • Android 基础

    1、Android布局 2、Android内存泄漏总结 3 、Handler内存泄漏分析及解决 4...

  • 性能优化与保活

    ------内存泄漏优化------Android 内存优化你的 Handler 内存泄露 了吗?Android卡...

  • android学习资料

    第一部分: Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析...

  • Android学习之旅

    1.Android基础知识2.Android内存泄漏总结3.Handler内存泄漏分析及解决4.Android性能...

  • Android - Handler导致的内存泄漏

    内存泄漏:没有用的对象,无法被GC垃圾回收,就会造成内存泄漏(OOM) Handler如果使用不当,极大可能造成内...

  • Android知识体系总结

    第一部分:Android(安卓)Android基础知识Android内存泄漏总结Handler内存泄漏分析及解决H...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 内存泄漏的场景及解决办法

    内存泄漏场景,以及开发过程如何避免内存泄漏。 判断 A引用B,A的生命周期长于B。 Handler导致内存泄漏:H...

  • Android 消息机制 你了解多少

    级别:★★☆☆☆标签:「Handler」「Android」「消息机制」「内存泄漏」作者: Zoyp晨[https:...

网友评论

      本文标题:Android - Handler导致的内存泄漏

      本文链接:https://www.haomeiwen.com/subject/rwngcqtx.html