内存泄漏

Handler

handler引用链

handler ——》messageTag——》message——》messagequeue(looper 生命周期长)

activity——》hanlder

成员内部类相当于一个外部类的成员变量,可以访问外部类的所有成员变量和方法。

局部内部类:定义在方法里,比方法的范围还要小,是内部类中最少用的一种类型。 所以它会像局部变量一样不可以被public , protected, private, static修饰。并且它只能够访问final类型的局部变量这样的话,局部内部类也就只能在其所属的方法中被new,并且调用方法。

匿名内部类 匿名内部类在哪里被new,就会持有所在类对象的引用。 

静态内部类与静态匿名内部类 static修饰的东西不在类的管辖范围之内。所以一旦被static修饰之后它不属于任何对象。所以这两种情况下是不会持有外部类引用的。

关于handler使用不当引发的内存泄漏自然也有了对应的解决方法,

1 要么把Myhandler搞成静态内部类

2 或者另外立一个文件专门写一个Myhandler类。 这两种一个可以避免内部类持有外部类,另一个更粗暴地不让它当内部类。 

要做就做彻底些,除了避免Handler持有Activity引发的内存泄露之外,在Activity结束的时候最好要remove一下发出去的那个message

3.handler引用activity时  使用弱引用

单例模式引发的内存泄漏

单例的周期是和app的生命周期一致。并且整个app内只有一个这样的实例。

尽量使用applicationContext ,必须要有activity的时候可以使用弱引用 或者主动释放activity

非静态内部类的静态实例引发的内存泄漏。

内部类引用了activity  静态实例的周期非常长 容易长期持有acivity 导致内存泄露。

可以使用静态修饰 避免对activity的引用

非静态匿名内部类引发的泄露

可以使用静态修饰 避免对activity的引用

注册、反注册未成对使用引发的内存泄漏

在ondestroy反注册 之前注册过的对象避免泄露

资源对象没有关闭引发的内存泄漏

对资源对象使用完后进行 close(), destroy(),recycler(),release() 等操作

集合对象没有及时清理引发的内存泄漏

我们通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。如果集合是static、不断的往里面添加东西、又忘记去清理,肯定会引起内存泄漏。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值