- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
── 朱鹏 * android内存管理 自我介绍 朱鹏 Android开发工程师 qq : 752061935 手机 :二手房 租房 新房 Why Android系统有自己的垃圾回收机制,可以自动回收内存空间。那为什么还需要专门做个针对内存管理做一个分享呢? 答案很简单: crash!!! Bitmap 谈到android内存管理这里不得不提的一个对象就是Bitmap。 内存大户 而一个andriod程序运行过程中所占用的内存(native+dalvik)超过16M(默认) OOM 查看内存使用情况 adb shell dumpsys meminfo $package_name or $pid Bitmap对象 bitmap对象 android虚拟机 (DVM) linux底层C内存 recycle() 首先明确一点无论你调用不调用recycle()方法,android程序都不会内存泄露。 recycle只做了一件事:The bitmap is marked as dead。 recycle真的用途在于:它可以帮助GC快速决定是否回收这个对象,当一个应用包含大量的图片的时候,这个方法还是很有作用的,因为GC并没有你想象的聪明。 recycle()具体使用 // 先判断是否已经回收 if(bitmap != null !bitmap.isRecycled()){ // 回收并且置为null bitmap.recycle(); bitmap = null; } 这里再介绍一个比较实用的方法 if(imageView != null imageView.getDrawable() != null){ Bitmap oldBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); imageView.setImageDrawable(null); if(oldBitmap != null){ oldBitmap.recycle(); } } 建议在一个大量使用图片的应用中activity继承以下BaseActivity public class BaseActivity{ ArrayListSoftReferenceBitmap bitmapCache = new ArrayListSoftReferenceBitmap(); @Override protected void onDestroy() { for(SoftReferenceBitmap sb:bitmapCache ){ 回收操作 } super.onDestroy(); } } bitmap什么时候会导致程序OOM 单张图片过大 解决方案: 1、调整dvm单个堆栈大小 2、压缩图片 3、切割图片 小图片累积过多 解决方案: 1、用完即手动recycle 图片压缩小技巧 在使用BitmapFactory压缩图片的时候,BitmapFactory.Options设置inJustDecodeBounds为true后,再使用decodeFile()等方法,可以在不分配空间状态下计算出图片的大小。示例: BitmapFactory.Options opts = new BitmapFactory.Options(); // 设置inJustDecodeBounds为true opts.inJustDecodeBounds = true; // 使用decodeFile方法得到图片的宽和高 BitmapFactory.decodeFile(path, opts); // 打印出图片的宽和高 Log.d(example, opts.outWidth + , + opts.outHeight); (ps:原理其实就是通过图片的头部信息读取图片的基本信息) Bitmap在listview和gallery中的典型使用 MapString, SoftReferenceBitmap mBitmapList ; public void loadImage(imageView,url){ 1、根据url从内存即mBitmapList 读取地图,如果内存没有读到图片则进行第二步。 2、根据url读取本地图片,如果没有读取到,则进行第三步。 3、将url加入下载队列,下载成功后将bitmap加入内存缓存即mBitmapList 。 } ps:在listvi
文档评论(0)