(第05天)Handler使用可能导致内存泄漏

  1. 非静态内部类和匿名内部类都会保留外部类的引用。
  2. 这个引用是强引用,引用在,JVM就不会回收。
  3. 我们经常会在类内声明自己的Handler类并创建对象。
  4. 当我们发送消息到消息队列时,实际消息包含了handler对象的引用
  5. 因为第1条,handler包含外部类的引用。
  6. 当使用sendMessageDelayed()方法时,消息在消息队列中,包含handler和外部类的引用,此时外部类就不能被回收,导致内存泄漏。

解决办法

  1. 将内部类Handler和匿名内部类都设置为static
  2. 在静态Handler类中使用弱引用
    1&&2,并非1||2

一个月后回头看,发现自己也看不懂了。。所以附加几条

  • 第1条是默认的。保留对外部类的引用,更准确地说是持有外部类对象的引用?
  • 第3、4条,当发送消息时,消息中包含Handler的引用。
  • loop中有延迟的消息时,该消息包含Handler,又因为第1条,Handler也包含外部类对象的引用,导致外部类对象不能被回收。

你可能感兴趣的:((第05天)Handler使用可能导致内存泄漏)