一.线程造成的内存泄漏
对于线程造成的内存泄漏,也是平时比较常见的,leakCanary官方Demo就是线程成造成的内存泄漏,使用了AsyncTask去执行异步线程,现在我们换个写法,直接使用Thread:
1. 新建工程,配置好leakCanary环境
2. 直接在MainActivity添加如下代码:
红色方框内的代码,可能每个人都这样写过。
OK ,我们执行一下,然后做如下操作:
1 MainActivity页面打开后,在20秒内点击手机返回键
2. 等待10秒
操作完成,leakCanary检测出内存泄漏。
分析原因:和上面几个案例的原因类似,不知不觉又搞了一个匿名内部类Runnable,对当前Activity都有一个隐式引用。如果Activity在销毁的时候,Runable内部的任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。正确的做法还是使用静态内部类的方式,如下:
上面代码中,自定义了静态的内部类MyRunable,实现了Runable ,然后在使用的时候实例化它。
运行代码后做如上相同操作,发现leakCannary没有检测出内存泄漏。
二. 资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
总结: