- 非静态内部类和匿名内部类都会保留外部类的引用。
- 这个引用是强引用,引用在,JVM就不会回收。
- 我们经常会在类内声明自己的Handler类并创建对象。
- 当我们发送消息到消息队列时,实际消息包含了handler对象的引用
- 因为第1条,handler包含外部类的引用。
- 当使用sendMessageDelayed()方法时,消息在消息队列中,包含handler和外部类的引用,此时外部类就不能被回收,导致内存泄漏。
解决办法
- 将内部类Handler和匿名内部类都设置为static
- 在静态Handler类中使用弱引用
1&&2,并非1||2
一个月后回头看,发现自己也看不懂了。。所以附加几条
- 第1条是默认的。保留对外部类的引用,更准确地说是持有外部类对象的引用?
- 第3、4条,当发送消息时,消息中包含Handler的引用。
- loop中有延迟的消息时,该消息包含Handler,又因为第1条,Handler也包含外部类对象的引用,导致外部类对象不能被回收。