Android图片内存优化的几点心得

1、将图片转化为缩略图再加载:

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 2;
 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 

该段代码即是读取1.png的缩略图,长度、宽度都只有原图片的1/2。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。由于各手机厂商缩放图片的算法不同,在不同手机上的缩放图片质量可能会不同。笔者就遭遇过moto手机上图片缩放后质量可以接受,三星手机上同样的缩放比例,质量却差很多的情况。

2、用ARBG_4444颜色模式加载图片:

Android中有四种,分别是:

ALPHA_8:每个像素占用1byte内存

ARGB_4444:每个像素占用2byte内存

ARGB_8888:每个像素占用4byte内存

RGB_565:每个像素占用2byte内存

Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inPreferredConfig = Bitmap.Config.ARGB_4444;
 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 

以上代码即是将1.png以ARGB_4444模式读出。内存减少虽然不如第一种方法明显,但是对于大多数图片,看不出与ARGB_8888模式有什么差别。不过在读取有渐变效果的图片时,可能有颜色条出现。另外,会影响图片的特效处理。

3、调用图片的recycle()方法:

这个其实不是真正降低图片内存的方法。主要目的是标记图片对象,方便回收图片对象的本地数据。图片对象的本地数据占用的内存最大,而且与程序Java部分的内存是分开计算的。所以经常出现Java heap足够使用,而图片发生OutOfMemoryError的情况。在图片不使用时调用该方法,可以有效降低图片本地数据的峰值,从而减少OutOfMemoryError的概率。不过调用了recycle()的图片对象处于“废弃”状态,调用时会造成程序错误。所以在无法保证该图片对象绝对不会被再次调用的情况下,不建议使用该方法。特别要注意已经用setImageBitmap(Bitmap
img)方法分配给控件的图片对象,可能会被系统类库调用,造成程序错误。

 

例如在小米手机上:

Bitmap old = img;
img = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
old.recycle();

这段代码会发生Bitmap对象已经被recycle的错误。在三星、moto、HTC、华为和其他一些厂商的机器上这段代码运行正常。虽然是厂商定制的系统实现机制不同造成的问题。但确实是需要注意的问题。

4、使用Matrix对象放大的图片如何更改颜色模式:
虽然使用Matrix对象放大图片,必定会耗费更多的内存,但有时候也不得不这样做。放大后的图片使用的ARGB_8888颜色模式,就算原图片是ARGB_4444颜色模式也一样,而且没有办法在放大时直接指定颜色模式。可以采用以下办法更改图片颜色模式。
Matrix matrix = new Matrix();
float newWidth = 200;//图片放大后的宽度
float newHeight = 300;//图片放大后的长度
matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());
Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);//得到放大的图片
img2 = img1.copy(Bitmap.Config.ARGB_4444, false);//得到ARGB_4444颜色模式的图片
img = null;
img1 = null;

这里比起原来的图片额外生成了一个图片对象img1。但是系统会自动回收img1,所以实际内存还是减少了。

 

归结起来还是以缩略图模式读取图片和减少图片中每个像素占用的内存。这两种方法虽然有效,但是也有各自的弊端。实际开发中还是应该根据情况酌情使用。最王道的办法,还是避免垃圾对象的产生。例如在ListView的使用中,复用convertView等。如果使用AsyncTask加载图片,要及时将引用的ImageView对象置为null。因为AsyncTask是用线程池实现的,所以其中引用的对象可能会拥有很长的生命周期,造成GC无法释放。我还是相信Android的内存回收机制的,recycle什么的虽然一定程度上有效,但总觉得不符合Java内存回收的原则。(最后这句完全是着魔了)

时间: 2024-09-19 09:55:30

Android图片内存优化的几点心得的相关文章

总结Android App内存优化之图片优化_Android

前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片就会占用内存12M,来回切换几次内存占用就会增涨到上百兆,为了在不影响APP的视觉效果的前提下,有必要通过各种手段来降低APP对内存的消耗. 通过DDMS的APP内存占用查看工具分析发现,APP中占用内存最多的是图片,每个Activity中图片占用内存

Android中内存优化的那些事 - 一个有关图片的优化记录

客服群里叫喊着:这个用户图片不显示了,那个用户图片也不显示了.我拿着手上一切正常的测试机,what the hell-- 默默地打开bugly.   满园春色关不住,遍地内存溢出来!是的,又闯祸了! 内存问题永远是既陌生又熟悉的话题,而且大多数都发生在一个叫作用户家的手机上.安卓系统本身不断的在优化,三方框架也逐渐成熟,外加手机厂商的大内存加持,似乎内存问题变得少见,但还是不能忽视. 借着这次修复内存问题的记录,分享一些"自以为"的解决思路,仅供参考.ok,let's go! 修复问题

总结Android App内存优化之图片优化

前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片就会占用内存12M,来回切换几次内存占用就会增涨到上百兆,为了在不影响APP的视觉效果的前提下,有必要通过各种手段来降低APP对内存的消耗. 通过DDMS的APP内存占用查看工具分析发现,APP中占用内存最多的是图片,每个Activity中图片占用内存

Android手机开发之图片内存优化几点

1.将图片转化为缩略图再加载:  代码如下  1 BitmapFactory.Options options = new BitmapFactory.Options(); 2 options.inSampleSize = 2; 3 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 该段代码即是读取1.png的缩略图,长度.宽度都只有原图片的1/2.图片大小减少,占用的内存自然也变小了.这么做的弊端是图片质量

Android内存优化杂谈_Android

Android内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作:1.优化RAM,即降低运行时内存.这里的目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概率.另一方面,不合理的内存使用会使GC大大增多,从而导致程序变卡.2.优化ROM,即降低程序占ROM的体积.这里主要是为了降低程序占用的空间,防止由于ROM空间不足导致程序无法安装. 本文的着重点为第一点,总结概述降低应用运行内存的技巧.在这里我们不再细述PSS.USS等概念与Android应用的

Android内存优化之OOM

原文:http://www.csdn.net/article/2015-09-18/2825737/1 10月14日-16日,由CSDN和创新工场联合主办的MDCC 2015中国移动开发者大会将在北京新云南皇冠假日酒店隆重召开,现在抢注大会门票,即享多重好礼!在平台与技术iOS专场议题全方位揭秘之后,平台与技术Android专场也有新动作!与会讲师--腾讯Android应用开发工程师 胡凯围绕着"Android内存优化之OOM"进行了非常深度的技术分享.   腾讯Android应用开发

android开发中的内存优化

一.Android应用程序内存优化 在开发Android App的过程中,经常会遇到内存方面的压力,比如OOM,或者频繁GC.本文不打算涵盖内存优化的所有方面,只是介绍一下我自己遇到的问题和解决方法. 1.确定频繁分配内存的代码路径 一般来说,频繁分配内存的路径可能会是绘制(draw)相关的方法,排版(layout)相关的方法,某些回调方法(特别是传感器回调方法).你可能会检查这部分代码,然后优化它.但是,内存分配可能发生在调用链的更下面,检查代码非常困难.这里推荐一个工具,DDMS下的Allo

Android应用性能优化最佳实践导读

前 言 为什么写这本书 一个好的应用,除了要有吸引人的功能和交互之外,在性能上也应该有高的要求,即使应用非常具有特色,或者功能和业务具有唯一性,在产品前期可能吸引了部分用户,但用户体验不好的话,也会给产品带来很差的口碑,如果有在体验上更好的竞品,用户也会很快转移.那么一个好的应用应该如何定义呢?主要有三方面: 业务/功能 符合逻辑的交互 优秀的性能 众所周知,Android系统作为以移动设备为主的一款操作系统,硬件配置有一定的限制,虽然配置现在越来越高级,但仍然无法和PC相比,在CPU和内存上的

Android应用性能优化最佳实践.

移动开发 Android应用性能优化最佳实践 罗彧成 著 图书在版编目(CIP)数据 Android应用性能优化最佳实践 / 罗彧成著. -北京:机械工业出版社,2017.1 (移动开发) ISBN 978-7-111-55616-9 I. A- II. 罗- III. 移动终端-应用程序-程序设计 IV. TN929.53 中国版本图书馆CIP数据核字(2016)第315986号 Android应用性能优化最佳实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037