Handler内存泄漏原因及解决方案

这篇具有很好参考价值的文章主要介绍了Handler内存泄漏原因及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Handler造成内存泄露的原因

在Activity中,将Handler声明成非静态内部类或匿名内部类,这样Handle默认持有外部类Activity的引用。如果Activity在销毁时,Handler还有未执行完或者正在执行的Message,而Handler又持有Activity的引用,导致GC无法回收Activity,导致内存泄漏。如以下两种情形可能导致内存泄漏

1、在Activity内将Handler声明成匿名内部类

   //匿名内部类
   private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
    };
   new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            //大量的操作,activity要销毁时还没结束
        }
    },1000);

2、在Activity内将Handler声明成非静态内部类:

   //非静态内部类
   private class MyHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
    }

    private MyHandler mHandler = new MyHandler();

二、解决方案

1、静态内部类 + 弱引用

   private static class MyHandler extends Handler {
        //弱引用,在垃圾回收时,activity可被回收
        private WeakReference<MainActivity> mWeakReference;

        public MyHandler(MainActivity activity) {
            mWeakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
    }

2.在Activity销毁时,清空Handler中未执行或正在执行的Callback以及Message:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //清空handler管道和队列
        mHandler.removeCallbacksAndMessages(null);
    }

3:非静态内部类 + 弱引用,在activity要回收时清除引用(麻烦,不推荐)文章来源地址https://www.toymoban.com/news/detail-566656.html

    private class MyHandler extends Handler {
        //弱引用,在垃圾回收时,activity可被回收
        private WeakReference<MainActivity> mWeakReference;

        public MyHandler() {
            this.mWeakReference = new WeakReference<>(MainActivity.this);
        }

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
    }
    
    private MyHandler mHandler = new MyHandler();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //手动清除应用
        mHandler.mWeakReference.clear();
    }

到了这里,关于Handler内存泄漏原因及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt中postevent造成内存泄漏问题的通用解决方案

    在Qt中由QCoreApplication统一管理Qt事件的收发和销毁,其中sendEvent为阻塞式发送,用于单线程的事件发送;postevent为非阻塞式发送,构造事件的线程和接受事件的线程可以为两个线程。 最近在做一个个人项目ShaderLab 需要绘制OpenGL实时渲染的图像,由于OpenGL渲染基本都放在循环语

    2024年02月15日
    浏览(41)
  • Java中关于内存泄漏分析和解决方案,都在这里了!

    最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可以文末留言探讨、补充。 如下是整篇文章的结构,所需阅读时间大约20min 内存泄漏 :对象已经没有被应用程序使用,但是垃圾回收器没办法

    2024年02月13日
    浏览(40)
  • ,详解Handler dispatch failed; nested exception is java.lang.NoSuchMethodError异常发生的原因以及排查问题方式和解决办法

    在系统测试的过程中,测试说有个功能报错,可是我们在本地测试都没有问题,报错如下: 看到异常后我们来解读一下这个异常: 日志头部 : 10:35:39.193 [http-nio-18070-exec-70] ERROR c.a.f.w.e.GlobalExceptionHandler :这表示在上午10点35分39秒,应用程序中的一个全局异常处理器( GlobalE

    2024年02月03日
    浏览(60)
  • ELK报错no handler found for uri and method [PUT] 原因

    执行后提示no handler found for uri and method post,最新版8.2的问题?   原因: index.mapping.single_type: true 在索引上 设置将启用按索引的单一类型行为,该行为将在6.0后强制执行。 原 {type} 要改为 _doc,格式如下 PUT {index}/_doc/{id} 和 POST {index}/_doc

    2024年02月12日
    浏览(48)
  • 接口报错原因分析:handler dispatch failed;nested exceptionis java.lang.outofMemoryError:JAVA heap space

    java.lang.OutOfMemoryError: Java heap space  解决方法 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 加上 JAVA_OPTS=-Xms64m -Xmx512m Linux 在{tomcat_home}/bin/catalina.sh的前面,加

    2024年02月08日
    浏览(47)
  • bladex定时任务job handler [xxx] not found解决

    第一次用bladex (看官方文档就出不来那种). 明明已经按照文档书写: 创建一个类 . 类中定义一个方法,方法上添加 @XxlJob(\\\"xxx\\\") 在xxljob的服务中配置 我们定义的 handler名称- xxx 启动测试 但是还是报 job handler [xxx] not found. 原因: 我们没有注册执行器 解决 我们的服务中心,新建配置类

    2024年02月06日
    浏览(41)
  • C/C++内存泄漏原因分析与应对方法

    一、内存泄漏的危害: 内存泄漏会导致当前应用程序消耗更多的内存,使得其他应用程序可用的内存更少了。 如果有个进程可用的内存不够,就会触发Linux操作系统的直接/后台内存回收(即将一些内存页的数据写到磁盘里,那么该页也就可用了,脏页回写)。虽然后台回收

    2024年02月16日
    浏览(47)
  • RabbitMq消息丢失原因及其解决方案

    我们首先了解下一条消息从生产到消费的整个流程如下: 生产--MQ Broker -- 消费。所以这三个环节都有丢失消息的可能。 1.1、生产者丢失消息 生产者将数据发送到rabbitmq的时候,可能因为网络问题导致数据就在半路给搞丢了。 1.使用事务(性能差) ​ RabbitMQ 客户端中与事务机

    2024年02月08日
    浏览(42)
  • SQLSyntaxErrorException异常产生原因及解决方案

    当我使用PreparedStatement 类进行数据库连接时,弹出错误 02 异常的产生原因 num=stmt.executeUpdate(sql);部分不需要再次传入sql executeUpdate:执行数据库的更新、插入和删除操作 ,返回改变记录的行数,但是使用PreparedStatement 类对传入数据进行加密时,在执行到这个语句的时候数据库

    2024年01月21日
    浏览(45)
  • 线程安全问题的原因和解决方案

    如果某个代码,在单线程执行下没有问题,在多线程执行下执行也没有问题,则称“线程安全”,反之称“线程不安全”。 目录 前言 一、简述线程不安全案例 二、线程安全问题的原因 (一)(根本问题)线程调度是随机的 (二)代码的结构问题 (三)代码执行不是原子的

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包