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

Handler使用不当,会导致内存泄露。

普通Handler初始化

这是简单的一个Handler 初始化的代码,很简洁明了(new 了一个非静态内部类)。

       在Java中非静态内部类和匿名内部类都会隐式持有当前类的外部引用 (划重点),所以我们在Activity中使用非静态内部类初始化了一个Handler,此Handler就会持有当前Activity的引用。

       在java,我们想要一个对象被回收,那么前提它不被任何其它对象持有引用,所以 当我们Activity页面关闭之后,如果 此时Handler 并没有释放Activity的引用,那么Activity不会被回收,当内存不足时,就会导致内存泄露。(场景:在Activity中使用Handler 做了一个延迟操作,Handler 因延迟时间未到 还没有执行,Activity 被关闭)

        解决办法:

        1.尽可能避免使用Handler做延迟操作。

         2.使用静态内部类继承Hanlder(静态内部类不会持有外部对象的引用),如果我们需要在Handler中 使用外部的Activity时,可以定义一个Activity弱引用(WeakReference)对象,弱引用在第二次GC回收时,可以被回收。

静态内部类Handler

         3.在onDestory 时,清除Handler消息队列中的消息removeCallbacksAndMessages(null)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。