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回收时,可以被回收。
3.在onDestory 时,清除Handler消息队列中的消息removeCallbacksAndMessages(null)