111111111

来源:互联网 发布:淘宝上的图片怎么做的 编辑:程序博客网 时间:2024/05/17 08:25
 

 
 加入收藏
网站地图
网站搜索
繁體 

首页Linux新闻Linux技术交流数据库技术Linux编程学习服务器应用Linux网络安全Linux下载Linux认证Linux主题Linux壁纸数码手机笔记本 首页 → Linux编程学习
 
-
阅读内容


Android下常见的内存泄露
[日期:2011-10-07] 来源:Linux社区  作者:DeamonTX

 
因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题。
于是有时遇到程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。
我们现在就来总结一下可能导致内存泄露的情况:

查询数据库而没有关闭Cursor
在Android中,Cursor是很常用的一个对象,但在写代码是,经常会有人忘记调用close, 或者因为代码逻辑问题状况导致close未被调用。 

通常,在Activity中,我们可以调用startManagingCursor或直接使用managedQuery让Activity自动管理Cursor对象。
但需要注意的是,当Activity介绍后,Cursor将不再可用!
若操作Cursor的代码和UI不同步(如后台线程),那没需要先判断Activity是否已经结束,或者在调用OnDestroy前,先等待后台线程结束。

除此之外,以下也是比较常见的Cursor不会被关闭的情况:

try {  
    Cursor c = queryCursor();  
    int a = c.getInt(1);  
    ......  
    c.close();  
} catch (Exception e) {  

虽然表面看起来,Cursor.close()已经被调用,但若出现异常,将会跳过close(),从而导致内存泄露。
所以,我们的代码应该以如下的方式编写:

Cursor c = queryCursor();  
try {      
    int a = c.getInt(1);  
    ......  
} catch (Exception e) {  
} finally {  
    c.close(); //在finally中调用close(), 保证其一定会被调用   

调用registerReceiver后未调用unregisterReceiver().
在调用registerReceiver后,若未调用unregisterReceiver,其所占的内存是相当大的。
而我们经常可以看到类似于如下的代码:

registerReceiver(new BroadcastReceiver() {  
    ...  
}, filter); ... 
这是个很严重的错误,因为它会导致BroadcastReceiver不会被unregister而导致内存泄露。

 


未关闭InputStream/OutputStream

在使用文件或者访问网络资源时,使用了InputStream/OutputStream也会导致内存泄露

 

Bitmap使用后未调用recycle()
根据SDK的描述,调用recycle并不是必须的。但在实际使用时,Bitmap占用的内存是很大的,所以当我们不再使用时,尽量调用recycle()以释放资源。

 


Context泄露

这是一个很隐晦的内存泄露的情况。
先让我们看一下以下代码:
private static Drawable sBackground;  
  
@Override  
protected void onCreate(Bundle state) {  
  super.onCreate(state);  
    
  TextView label = new TextView(this);  
  label.setText("Leaks are bad");  
    
  if (sBackground == null) {  
    sBackground = getDrawable(R.drawable.large_bitmap);  
  }  
  label.setBackgroundDrawable(sBackground);  
    
  setContentView(label);  

在这段代码中,我们使用了一个static的Drawable对象。
这通常发生在我们需要经常调用一个Drawable,而其加载又比较耗时,不希望每次加载Activity都去创建这个Drawable的情况。
此时,使用static无疑是最快的代码编写方式,但是其也非常的糟糕。
当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback (通过调用Drawable.setCallback()实现)。
这就意味着,这个Drawable拥有一个TextView的引用,而TextView又拥有一个Activity的引用。
这就会导致Activity在销毁后,内存不会被释放。

 

收藏到网摘:         

 

上一篇:关于Android中的BaseAdapter
下一篇:Android Jamendo开源在线音乐播放器源码分析

相关资讯       Android开发 
Android开发之路——Android的布局初步2—  (08月14日)
Android开发之路——第三个Android小程序(  (08月14日)
Android开发之路——第一个Android小程序(  (08月14日)
 Android开发之路——Android的布局初步  (08月14日)
Android开发之路——第二个Android小程序(  (08月14日)
Android之路——走进Android(工程结构剖析)  (08月14日)
 

相关图片
Android开发教程:用G如何在WebView中建立AAndroid开发教程:LisAndroid:一个容易被Android 翻页卷曲 电MT6573 Android在Ecli仿iPhone 气泡短信 自Android service 精辟
本文评论       全部评论
发表评论
 
请您注意:
遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。
LinuxIDC.com拥有管理笔名和留言的一切权利。


点评:  字数
姓名:  
 
 -
最新资讯
i.mx51开发板利用已有的镜像文件(SD卡启动)刷写Andr
抢鲜体验:Fedora 16已经坠入“云”河
Ubuntu考虑放弃Banshee和Mono
Android工程文件下assets文件夹与res文件夹的区别
Android的两种异步机制
Ubuntu 10.04下安装Java(JDK)和Eclipse C&C++编
关于ThinkPHP在Nginx服务器下出错的解决方法
Google App Engine 1.6 预览版发布
Libreoffice 3.4.4 发布,修复很多 bug
Thunderbird 8.0 正式发布 简体中文版下载
Qt SDK 更新 1.1.4
Adobe Flash 无奈放弃移动设备
Linux壁纸:美女壁纸连载(四)
GTK 3.x 主题:Luminaire
分区魔术师Paragon Partition Manager™10.0 Server
XP下硬盘安装CentOS 6.0图解教程
在64位Windows 7下硬盘安装64位CentOS 6.0
Apache 2.2.4整合Tomcat 6.0.16三种方式的详细配置
Shell 跟Java 相互调用和获取结果
Linux认证辅导:关于fsck,mount


  ") 
本周热门
Linux shell脚本全面学习
Android核心分析
详细易懂的Linux makefile 教程
Android Binder设计与实现 – 设计篇
Linux内核的ioctl函数学习
技术内幕:Android的IPC机制-Binder
u-boot-2009.08在mini2440上的移植
Android之PopupWindow弹出对话框
Android驱动例子(LED灯控制)
S3C2440上LCD驱动(FrameBuffer)实例开发讲解
Android C/C++ 开发
在Linux下安装GCC
Android控件Gallery 3D效果
Android RIL 调试分析全记录
Java删除文件
Android深入浅出之Binder机制
Linux Platform驱动程序框架解析
在Ubuntu上为Android系统编写Linux内核驱动程序
Android开发入门——Socket编程
基于Linux的v4l2视频架构驱动编写
Linux下SPI驱动分析
百度地图API之根据经纬度查询地址信息(Android)
在Windows平台下使用安装GCC(图)
Android中ImageButton的运用详解
Android解析XML文件的三方法
 


Linux公社简介 - 广告服务 - 网站地图 - 帮助信息 - 联系我们
本站(LinuxIDC)所刊载文章不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。
主编:漏网的鱼 (QQ:3165270) 联系邮箱: (如有版权及广告合作请联系)
本站带宽由[6688.CC]友情提供
关注Linux,关注LinuxIDC.com,请向您的QQ好友宣传LinuxIDC.com,多谢支持!
Copyright © 2006-2011 Linux公社 All rights reserved 浙ICP备06018118号

 
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-10/44785.htm

原创粉丝点击