Android 内存泄露
来源:互联网 发布:苹果mac浏览器如何收藏 编辑:程序博客网 时间:2024/04/29 13:09
1.查询数据库而没有关闭Cursor
Cursor c =querryCursor();
try{
….
}catch(Exception e){
….
}finally{
c.close();
}
这样写能保证在发生异常时也可以正常关闭cursor
2.InputStream 、OutputStream 未关闭导致的内存泄露
3.广播BroadCastReceiver注册后未调用unregisterReceiver
4.Bitmap使用后未recycle
5.Context内存泄露
5.1static Drawable 引起的context泄露
这种情况发生在Android 3.0之前,查看setBackgroundDrawable(Drawable background)方法源码里面有一行代码引起我们的注意:
public void setBackgroundDrawable(Drawable background) { // ... ... background.setCallback(this); // .... .... }
这里this持有对view的引用,而view持有对当前activity的引用。所以当activity退出时,由于 static Drawable 是静态变量,它的生命周期没有结束,而它间接持有activity的引用,导致当前activity无法被销毁引起内存泄露。
Android 3.0 后 官方对setCallback()做了如下调整,从而有效的避免了这一内存泄露
public final void setCallback(Callback cb) { mCallback = new WeakReference<Callback>(cb);}
5.2 System Service 引起的内存泄露 一些厂商定义的服务,或者厂商自己修改了一些新的代码导致系统服务引用了Context对象不能及时释放,我曾经碰到过Wifi,Storage服务都有内存泄露。这时候我们传application 就可以得到解决。5.3 Handler 引起的内存泄露 handler内存泄露的两个因素 1)内部类 2)生命周期与activity 不一致 解决方案: 1)静态内部类+弱引用 静态内部类不会持有对外部类的引用 2)在Activity onStop或者onDestroy的时候,取消掉该Handler对象的Message和Runnable, removeCallbacks(Runnable r)和removeMessages(int what)等。5.4 Thread 引起的内存泄露 同Handler对象可能造成内存泄露的原理一样,Thread的生命周期不一定是和Activity生命周期一致。而且因为Thread主要面向多任务,往往会造成大量的Thread实例。据此,Thread对象有2个需要注意的泄漏点:1). 创建过多的Thread对象2). Thread对象在Activity退出后依然在后台执行解决方案是:1). 使用ThreadPoolExecutor,在同时做很多异步事件的时候是很常用的,这个不细说。2). 当Activity退出的时候,退出Thread。
0 0
- Android 内存泄露
- android内存泄露 mat
- 预防Android内存泄露
- 预防Android内存泄露
- 预防Android内存泄露
- Android 避免内存泄露
- Android内存泄露分析
- Android内存泄露
- 避免Android内存泄露
- android 内存泄露
- Android 内存泄露测试
- 避免Android内存泄露
- android 内存泄露调试
- 避免Android内存泄露
- android内存泄露优化
- android 内存泄露 小结
- android内存泄露
- Android内存泄露
- 调整数组顺序使奇数位于偶数前面
- 1024程序员节,黑马程序员课程开启限时秒杀
- Java泛型
- SAP打印过程介绍
- navicat permium 连接Oracle 报错:Cannot load OCI DLL
- Android 内存泄露
- 开发流程模型
- 面向对象程序设计概念
- 正则表达式
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- 安卓Glide框架使用总结
- Less查询日志可方便翻页
- mysql service 启动
- 调整数组顺序使奇数位于偶数前面[剑指offer]之python实现