参考自Android内存优化大全(中)
一、Bitmap优化
修改图片的显示大小
- 不要用ImageView直接显示,会占用较多的资源,特别是图片较大时,会造成系统的奔溃。可以使用BitmapFactory.Options进行设置参数inSampleSize,该参数若为2,则表示显示的图片是原图的1/2。
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeFile(sourceBitmap, options);
修改图片像素
BitmapFactory.Options进行设置参数inPreferredConfig,参数的意义如下:
- ALPHA_8:每个像素占用1byte内存
- ARGB_4444:每个像素占用2byte内存
- ARGB_8888:每个像素占用4byte内存(默认)
- RGB_565:每个像素占用2byte内存
在对图片的要求不高的时候,使用RGB_565可以提高性能
public static Bitmap readBitMap(Context context, int resId) {
BitmapFactory.Options opt = newBitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//获取资源图片
InputStream in = context.getResources().openRawResource(resId);
returnBitmapFactory.decodeStream(in, null, opt);
}
回收图片
在使用完图片之后,调用bitmap.recycle()方法对图片进行回收。
// 先判断是否已经回收
if(bitmap != null && !bitmap.isRecycled()){
// 回收并且置为null
bitmap.recycle();
bitmap = null;
}
System.gc(); //提醒系统进行垃圾回收
捕获异常
在完成上述操作后,添加捕获异常处理
Bitmap bitmap = null;
try {
......
// 实例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
// 捕获OutOfMemoryError,避免直接崩溃
}
if (bitmap == null) {
// 如果实例化失败 返回默认的Bitmap对象
return defaultBitmapMap;
}