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

来源:互联网 发布:什么软件炒股最好 编辑:程序博客网 时间:2024/04/30 09:52
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。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。由于各手机厂商缩放图片的算法不同,在不同手机上的缩放图片质量可能会不同。笔者就遭遇过moto手机上图片缩放后质量可以接受,三星手机上同样的缩放比例,质量却差很多的情况。

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

Android中有四种,分别是:

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

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

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

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

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

1 BitmapFactory.Options options = new BitmapFactory.Options();2 options.inPreferredConfig = Bitmap.Config.ARGB_4444;    3 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)方法分配给控件的图片对象,可能会被系统类库调用,造成程序错误。

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内存回收的原则。(最后这句完全是着魔了)


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卧室壁纸贴的太花了怎么办 贴完墙纸接头处看着是黑色的怎么办 把所有内容放在一张纸上怎么办 孩子脸上被蚊香烧了留下了疤怎么办 微信怎么修改支付密码忘了怎么办 去网鱼网咖上网没带身份证怎么办 淘宝买家号忘了账号和密码怎么办 80多岁的老人前列腺疼怎么办啊 新浪微博发二维码让我入群我怎么办 队友送的太崩了打野应该怎么办 该商品不支持在当前地区销售怎么办 此商品不支持在当前地区销售怎么办 村淘商品在淘宝没展现怎么办 qq音乐不小心充了会员怎么办 古奇的包五金磨掉色了怎么办 淘宝购物津贴买的东西退款怎么办 淘宝买的东西质量太差怎么办 咸鱼上买的东西有问题怎么办 咸鱼买到的东西有问题怎么办 天猫超市买的东西有问题怎么办 满白天的宝宝睡觉总哭怎么办 京东退货显示在售后检测要怎么办 装修公司定金交了公司关门怎么办 背冷、腰泠、屁股冷、大腿冷怎么办 买家退款把卖家地址写错了怎么办 退款编号写错了提交了怎么办 京东购物收到货第二天搞活动怎么办 玩王者荣耀来电话断网怎么办 苹果7p玩王者荣耀卡怎么办 手机丢了隐私空间里面的照片怎么办 微信内存满了打不开了怎么办 u盘内存满了打不开了怎么办 清算组出的报告书无法清算怎么办 手机停机了收不到快递取件码怎么办 买东西货到了不小心确认收货怎么办 不小心用了蚂蚁花呗怎么办 q微店忘记密码怎么办微忘记密 在优酷买了开通会员不想续费怎么办 微店怎么卖吃的要认证怎么办 在天猫买东西遇到不讲理卖家怎么办 天猫退货收到退款了卖家拒绝怎么办