Android内存泄漏(线程造成的内存泄漏与资源未关闭造成的内存泄漏)



一.线程造成的内存泄漏

对于线程造成的内存泄漏,也是平时比较常见的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销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

 

 

总结

以上Android开发中常见的内存泄漏问题及解决办法,能对内存泄漏有一定的认识和见解,是同学们面试时的一个极其有利的加分项, 内存泄漏是很多有一定开发经验的程序员都会犯的错误,掌握这些,代表你确确实实做过一些东西,并有一定的总结。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值