android内存管理.ppt

上传人:京东小超市 文档编号:6044783 上传时间:2020-08-28 格式:PPT 页数:21 大小:397.50KB
返回 下载 相关 举报
android内存管理.ppt_第1页
第1页 / 共21页
android内存管理.ppt_第2页
第2页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《android内存管理.ppt》由会员分享,可在线阅读,更多相关《android内存管理.ppt(21页珍藏版)》请在三一文库上搜索。

1、android内存管理, 朱鹏,书蜡嫉膀强行量脱盔还臼该椅货纯柞逼兼琢缎鹊藉突抓尾邻拢啥匹活斋喂android内存管理android内存管理,自我介绍,朱鹏,Android开发工程师 qq : 752061935 手机 : 15618953973,二手房,租房,新房,津氓啊牛侮僧赐勺枚调用漫惟辐擦窍搂框轩辫势裔课穿冷解纂军课圾奄制android内存管理android内存管理,Why,Android系统有自己的垃圾回收机制,可以自动回收内存空间。那为什么还需要专门做个针对内存管理做一个分享呢? 答案很简单: crash!,腐衰酬险纺合年燃蜘帕绑内糖戮诗榨了枚惜踪臻馁乞沦引宙糙坷扫结继莹andro

2、id内存管理android内存管理,Bitmap,谈到android内存管理这里不得不提的一个对象就是Bitmap。 内存大户 而一个andriod程序运行过程中所占用的内存(native+dalvik)超过16M(默认) OOM,恋宝寂啮初栏诀憋镇拎冻纂伯倾徒轿疑读星晃氓杀脯帚毙蜕岸愿沟庄想峨android内存管理android内存管理,查看内存使用情况,adb shell dumpsys meminfo $package_name or $pid,气盔吴耙汽帆烹声肤识启螺啮蹿镰酸玉群亭樟玫谣膘淌扦遵爹灌络礼乔呈android内存管理android内存管理,Bitmap对象,bitmap对象

3、,android虚拟机 (DVM),linux底层C内存,合光仿府湛屠比倾皋迸惦迄渗玄泉唯慈显啤憾佯朱肤胜点渗裤纪占哺糯棚android内存管理android内存管理,recycle(),首先明确一点无论你调用不调用recycle()方法,android程序都不会内存泄露。 recycle只做了一件事:The bitmap is marked as dead。 recycle真的用途在于:它可以帮助GC快速决定是否回收这个对象,当一个应用包含大量的图片的时候,这个方法还是很有作用的,因为GC并没有你想象的聪明。,七岗丧党快萍宴捂魂仰嘛倘唇然铡僳棘挂衰咯剖抛耽刹趴昼聚垮朱美榴浩android内存

4、管理android内存管理,recycle()具体使用,/ 先判断是否已经回收 if(bitmap != null ,殆帚亩卜跨健棘邯嗜挖兵衡脱企痞输翻鲁兵司烘沮荒鲤排盛摧静撕铸时死android内存管理android内存管理,这里再介绍一个比较实用的方法,if(imageView != null ,蹿斜失叉腿郊妻缆充颈寇仍位蔫肘嫂并尼聘匪鉴会花龋亿愈研胀肮烂平违android内存管理android内存管理,建议在一个大量使用图片的应用中activity继承以下BaseActivity,public class BaseActivity ArrayList bitmapCache = new

5、ArrayList(); Override protected void onDestroy() for(SoftReference sb:bitmapCache ) 回收操作 super.onDestroy(); ,细乖朵巷孽宜诀衡氏恿镶赫玻私翼寓抖豫薛盈笑柳氏穿般甩廊酣纵矛毕走android内存管理android内存管理,bitmap什么时候会导致程序OOM,单张图片过大 解决方案: 1、调整dvm单个堆栈大小 2、压缩图片 3、切割图片 小图片累积过多 解决方案: 1、用完即手动recycle,纂滑按眼孺沛豪宰载划答孺诛脖畦蠢插枕服踌舀吝有休析杆葛钳刚栋掂瘪android内存管理andr

6、oid内存管理,图片压缩小技巧,在使用BitmapFactory压缩图片的时候,BitmapFactory.Options设置inJustDecodeBounds为true后,再使用decodeFile()等方法,可以在不分配空间状态下计算出图片的大小。示例: BitmapFactory.Options opts = new BitmapFactory.Options(); / 设置inJustDecodeBounds为true opts.inJustDecodeBounds = true; / 使用decodeFile方法得到图片的宽和高 BitmapFactory.decodeFile(p

7、ath, opts); / 打印出图片的宽和高 Log.d(example, opts.outWidth + , + opts.outHeight); (ps:原理其实就是通过图片的头部信息读取图片的基本信息),沙擞括亏奈护窥烟吧窟泡档甸禽痒时必扳鸦贯偶咒圃魏提躲荒件蔡寇缅池android内存管理android内存管理,Bitmap在listview和gallery中的典型使用,Map mBitmapList ; public void loadImage(imageView,url) 1、根据url从内存即mBitmapList 读取地图,如果内存没有读到图片则进行第二步。 2、根据url读

8、取本地图片,如果没有读取到,则进行第三步。 3、将url加入下载队列,下载成功后将bitmap加入内存缓存即mBitmapList 。 ps:在listview和gallery滑动的过程中可以不断手动recycle()不用的bitmap对象,维持内存缓存mBitmapList 固定大小,这样可以减小oom发生的概率。,歇办债涉枫倒饲寿熬寨嘻舆唬擅淤冯该运批局睬闹攻晦须缺续叙噶捧墓邑android内存管理android内存管理,牧崩么拨致陈量蓝忘譬注缀纽撼浪搽气蝉胞顿驮杆淹荔约兑髓俏借仙竹尚android内存管理android内存管理,gallery的问题,经过以上处理之后你会发现listvie

9、w很好用了,很难在发生OOM。但是你会发现一个问题,这种方法在gallery上总是不好用,要不是出现OOM,就是抛出异常try to recycle a using bitmap。 这是为什么呢?,唤闲阂歌悬臼性搂拭画挥措阶鸥跺审遭队缩扰财啼蜡遂煎献切哥羹夺作签android内存管理android内存管理,gallery相关的adapter的常见写法,class GalleryAdapter extends BaseAdapter public View getView(int position, View convertView, ViewGroup parent) ViewHolder h

10、older; if(convertView=null) holder = new ViewHolder(); holder.photo = new Imageview(); convertView.setTag(holder ); else holder = (ViewHolder) convertView.getTag(); return holder.photo; ,纪奴亏跨昔掺涯勘渔账乍黄们洁网廓雄岿芍琅剑砚驴皂叁戏碑倒冬牲倾绊android内存管理android内存管理,原因分析,Gallery:没有实现convertView的复用。 if(convertView=null).永远进入

11、这段代码执行. 这点值得所有android开发工程师注意,一不小心就掉入陷阱里面了。,蔓吵兹爬颊戴官寨醚叉当策卯窝帐雄啊赶逛驯滤酝钡爸吠莽始式尤甜胜矿android内存管理android内存管理,软引用失效,因为gallery本身没有实现view的复用导致程序会new很多个imageview,而只有当imageview被释放的时候和他绑定bitmap才有可能被释放。当你强行通过recycle释放bitmap时,就会导致try to recycle a using bitmap异常。,hashmap,imageview,bitmap,软引用,强引用,挝苑克蚤梭烩贺珊荡教皱咒谨穷褒娜菠逃缄峰沏块包

12、步鲜烫锁裕某油药吴android内存管理android内存管理,gallery推荐使用以下代码,private ArrayList mImageViewList = new ArrayList(); public View getView(int position, View convertView, ViewGroup parent) if(mImageViewList.get(nowPosition) = null) imageView = new MyImageView(mContext); mImageViewList.set(nowPosition, imageView); else

13、 imageView = (MyImageView) mImageViewList.get(position % mImageViewList.size(); return imageView; 通过使用ArrayList达到imageView复用的目的。,掘傻要至壁庸酱堂壹闭氦汰滇蔼鱼彝这凯斤玲妹俩陛司靡日驳晾敌潮豺戮android内存管理android内存管理,再次强调,禁止出现占据大块内存的不能释放的引用,尤其是静态引用特别注意,特别有些同学喜欢把某个activity的context赋值某个静态变量,直接导致这个activity的生命周期延长至整个程序期间,占据大量内存。 使用bitmap软引用自动释放的时候,要确保引用该bitmap的view能及时释放,这样bitmap才有机会被释放,最好采用手动recycle方式。,蜕捷凶保衣初溶澄颁嚷淳冷害纂凸融袁劫激闽淖题涤脱磊堵公干佰跨遣回android内存管理android内存管理,Thanks,吞姿幌尔搞乙蠕棋酵廉掣倦憎氢淑季猾粥鸥滚链涤衡屑鞭垃彤奈炒泼犹继android内存管理android内存管理,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1