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,內存不足回收對象)。