文章目录

  • 前言
  • 一、Looper 导致内存泄露
  • 二、Activity 传给长生命周期对象
  • 三、实例化其他类的静态接口
  • 四、内部类和匿名内部类
  • 五、Fragment 中 addFragment
  • 总结



前言

所举实例,皆为项目中实际遇到,如有描述错误,欢迎评论指正,感谢


提示:以下是本篇文章正文内容,下面案例可供参考

一、Looper 导致内存泄露

描述:
BaseActivity 有个线程,内部实现了 Looper.prepare(); … Looper.loop(); 因为其内部是个死循环,而且还持有子activity引用,
解决:
destroy时调用 该子线程 所持有loop 的quit方法

二、Activity 传给长生命周期对象

描述:
在activity中 尽量不要把this 传给其他对象,特别是第三方框架,因为不知道其内部如何引用,检查的时候也比较困难。
解决:
长生命周期对象 如单例 传Application , 因为传Application 是跟随app的生命周期的,app一退出,所有内存也烟消云散。

三、实例化其他类的静态接口

描述:
比如A(Activity或Fragment)类内部 实例化了一个B类的静态接口,该接口会持有B 对象的引用,导致A 对象不可被回收.
解决:
在A(Activity或Fragment) 退出时,手动将该接口置空 如 B.callback = null

四、内部类和匿名内部类

描述:
不论是内部类还是匿名内部类 都默认持有外部类的引用,有时候需要将 实例化它类的接口,和一些广播接收器 传给外部,外部就间接持有了该类。注意:此处外部是长生命周期对象
解决:
在(Activity或Fragment)退出时,手动将外部所引用的接口或回调置空,注意外部类使用这些东西时尽量做些判空操作。

五、Fragment 中 addFragment

描述:
后者(被addFragment 的 Fragment)会生命周期会跟随前者依附的activity 变化,就是 前者退出时 会回调onDestroy,而在其内部add的fragment 则不会回调onDestroy!!! 注意:后者内部有耗时操作,切在其onDestory 中释放资源
解决:
这也不全算内存泄露,因为如果是在MainActivity 此时就算内存泄露,如果是其他activity 在你退出时,那个fragment 也会随之销毁,内存也随之被回收。


总结

1.内存泄露就一句话,长生命周期对象持有短生命周期对象,造成内存不可被回收。

2.上面没写Handler 导致内存泄露,是因为 在项目中真不是那么容易写出来的,写Android 听过最多的就是 Handler 导致内存泄露,就算写出来 编译器 也给你报一片黄,这个应该是每个安卓开发者都会留意的地方
3.出现问题往往是使我们放松警惕的地方,其实编码中稍加留意,上面问题都是可以避免,

最后祝大家写代码永远没有bug。

你浸淫于程序的迷城,坚持心中的梦想。关心你的朋友,只能在城外锣鼓喧天摇旗呐喊,其实你只需要静谧的私人空间。世人需要娱乐,你开发出游戏。世人需要朋友,你做出交友网站。世人需要聊天,你编写出两只企鹅。你就是网络上最可爱的人,向你致敬!程序员