android内存优化之图片优化,android内存优化之图片优化

对图片自己进行操做。尽可能不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,由于这些方法在完成decode后,最终都是经过java层的createBitmap来完成的,须要消耗更多内存。所以,改用先经过BitmapFactory.decodeStream方法,建立出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。若是在读取时加上图片的Config参数,能够更有效的减小加载的内存,从而更有效阻止抛出内存异常。另外,decodeStream直接拿图片来读取字节码了,不会根据机器的各类分辨率来自动适应,使用了decodeStream以后,须要在hdpi和mdpi,ldpi中配置相应的图片资源,不然在不一样分辨率机器上都是一样大小(像素点数量),显示出来的大小就不对了。  java

复制代码代码以下:

InputStreamis=this.getResources().openRawResource(R.drawable.pic1);

BitmapFactory.Optionsoptions=newBitmapFactory.Options();

options.inJustDecodeBounds=false;

options.inSampleSize=10;//width,hight设为原来的十分一

Bitmapbtp=BitmapFactory.decodeStream(is,null,options);

复制代码代码以下:

if(!bmp.isRecycle()){

bmp.recycle()//回收图片所占的内存

system.gc()//提醒系统及时回收

}

复制代码代码以下:

/**

*以最省内存的方式读取本地资源的图片

*@paramcontext

*@paramresId

*@return

*/

publicstaticBitmapreadBitMap(Contextcontext,intresId){

BitmapFactory.Optionsopt=newBitmapFactory.Options();

opt.inPreferredConfig=Bitmap.Config.RGB_565;

opt.inPurgeable=true;

opt.inInputShareable=true;

//获取资源图片

InputStreamis=context.getResources().openRawResource(resId);

returnBitmapFactory.decodeStream(is,null,opt);

}

option中的值指的是,图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会致使图片不清晰。长度、宽度都只有原图片的1/2。图片大小减小,占用的内存天然也变小了。这么作的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。因为各手机厂商缩放图片的算法不一样,在不一样手机上的缩放图片质量可能会不一样。笔者就遭遇过moto手机上图片缩放后质量能够接受,三星手机上一样的缩放比例,质量却差不少的状况。

Android中有四种,分别是:

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

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

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

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

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

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

优化Dalvik虚拟机的堆内存分配。对于Android平台来讲,其托管层使用的DalvikJavaVM从目前的表现来看还有不少地方能够优化处理,好比咱们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法能够加强程序堆内存的处理效率。使用方法:

复制代码代码以下:

privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;

VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

便可。

还有就是能够定义堆内存的大小。

复制代码代码以下:

privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//设置最小heap内存为6MB大小

调用图片的recycle()方法:

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

使用Matrix对象放大的图片如何更改颜色模式:

虽然使用Matrix对象放大图片,一定会耗费更多的内存,但有时候也不得不这样作。放大后的图片使用的ARGB_8888颜色模式,就算原图片是ARGB_4444颜色模式也同样,并且没有办法在放大时直接指定颜色模式。能够采用如下办法更改图片颜色模式。

代码以下

复制代码代码以下:

Matrixmatrix=newMatrix();

floatnewWidth=200;//图片放大后的宽度

floatnewHeight=300;//图片放大后的长度

matrix.postScale(newWidth/img.getWidth(),newHeight/img.getHeight());

Bitmapimg1=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,因此实际内存仍是减小了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值