android 内存优化篇

来源:互联网 发布:mac连不上wifi手机可以 编辑:程序博客网 时间:2024/06/06 07:27

一、图片内存优化操作:
一般来说,我们对图片进行操作比较多的就是setImageBitmap、setImageResource,这些都是通过BitmapFactory.decodeResource来获取位图,现在发现当程序需要用到的图片较多时候,容易产生oom,因为这些法在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
现在推荐大家改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,因为decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。当然如果在读取时加上图片的Config参数,可以更有效的减少加载的内存,从而更有效阻止抛出内存异常。另外,decodeStream直接拿图片来读取字节码了,不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
示例:
/**
*以最省内存的方式读取本地资源的图片
*@paramcontext
*@paramresId
*@return
*/
public static readBitMap(Context context,int resId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//获取资源图片
InputStreamis=context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
注:
1、opt.inPurgeable=true; //为True的话表示使用BitmapFactory创建的Bitmap用于存储Pixel的内存空间在系统内存不足时可以被回收,在应用需要再次访问Bitmap的Pixel时(如绘制Bitmap或是调用getPixel),系统会再次调用BitmapFactory decoder重新生成Bitmap的Pixel数组。为了能够重新解码图像,bitmap要能够访问存储Bitmap的原始数据。
2、options.inJustDecodeBounds=false;
3、options.inSampleSize=10;//这个值越大表示图片质量越差,这个10表示长宽为原来图片的10分之一。

二、优化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大小