1、优化原因
- Bitmap 消耗内存,内存占用过多容易发生 OOM。
2、优化方案
1、使用完释放图片资源。
2、根据图片的质量压缩。
3、根据图片的尺寸压缩。
4、设置图片缓存。
- 使用完释放图片资源。
1.释放图片资源 + 软引用(SoftReference)。
private Bitmap mBitmap;
private SoftReference<Bitmap> bitmapSoftReference;
public static void recycleBitmap(Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
BitmapUtil.recycleBitmap(mBitmap);
if(bitmapSoftReference!=null){
BitmapUtil.recycleBitmap(bitmapSoftReference.get());
}
}
- 根据图片的质量压缩。
1、质量压缩比例 = quality / 100。
// 对图片质量进行压缩
public static Bitmap compressBitmap(Bitmap bitmap) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到 os 中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
int quality = 100;
// 循环判断如果压缩后图片是否大于0.5M,大于继续压缩
while (os.toByteArray().length > 1024 * 512) {
// 清空os
os.reset();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, os);
// 每次都减少10
quality -= 10;
}
// 把压缩后的数据os存放到ByteArrayInputStream 中
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
// 把 ByteArrayInputStream 数据生成图片
Bitmap newBitmap = BitmapFactory.decodeStream(is, null, null);
return newBitmap;
}
- 根据图片的尺寸压缩。
1、设置解码方式(inPreferredConfig ):ARGB_8888(默认)、ARGB_4444、ARGB_565、ALPHA_8。
2、设置图片缩放比例:缩放比例 = 1 / inSampleSize(inSampleSize<1?1:inSampleSize)。
// 对图片尺寸进行压缩
public static Bitmap compressBitmap(Bitmap bitmap,int width,int height){
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到 os 中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
// 把压缩后的数据os存放到 ByteArrayInputStream 中
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 解码方式
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.decodeStream(is, null, options);
// 缩放比例
int inSampleSize = calculateInSampleSize(options, width, height);
options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
is = new ByteArrayInputStream(os.toByteArray());
Bitmap newBitmap = BitmapFactory.decodeStream(is, null, options);
return newBitmap;
}
public static int calculateInSampleSize(BitmapFactory.Options var0, int var1, int var2) {
int var3 = var0.outHeight;
int var4 = var0.outWidth;
int var5 = 1;
if (var3 > var2 || var4 > var1) {
int var6 = Math.round((float) var3 / (float) var2);
int var7 = Math.round((float) var4 / (float) var1);
var5 = var6 > var7 ? var6 : var7;
}
return var5;
}
- 设置图片缓存。
1、优化原因:重复加载图片消耗资源(CPU、内存、流量)。
2、优化方案:1、三级缓存:内存缓存->本地缓存(数据库、文件)->网络缓存。2、软引用(SoftReference,内存不足回收对象)。