1. 程式人生 > 實用技巧 >Android面試題:大圖載入,防止OOM

Android面試題:大圖載入,防止OOM

這是位元組面試官問的一個問題,平時Glide用慣了,讓我說大圖載入原理答不上來。

大圖如果直接載入到記憶體,往往會導致OOM,因為大圖所佔記憶體非常大。

Bitmap直接載入

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);

直接從資源中載入,方法非常簡單,拿到Bitmap物件然後塞入ImageView中即可。這方式小圖片還能正常載入,大圖片就有問題了。

大圖載入步驟

  1. 獲取大圖尺寸
  2. 獲取ImageVIew的尺寸,縮放減小記憶體
  3. 載入

大圖尺寸獲取

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);

執行結果可以看到bitmap並未載入,而是獲取到了圖片的大小:outHeight和outWidth

減小記憶體

  1. 根據ImageView大小計算縮放比例inSampleSize
  2. 選擇佔記憶體小的顏色模式,設定option.inPreferredConfig,有以下值可以選擇
引數取值 含義
ALPHA_8 圖片中每個畫素用一個位元組(8位)儲存,該位元組儲存的是圖片8位的透明度值
RGB_565 圖片中每個畫素用兩個位元組(16位)儲存,兩個位元組中高5位表示紅色通道,中間6位表示綠色通道,低5位表示藍色通道
ARGB_4444 圖片中每個畫素用兩個位元組(16位)儲存,Alpha,R,G,B四個通道每個通道用4位表示
ARGB_8888 圖片中每個畫素用四個位元組(32位)儲存,Alpha,R,G,B四個通道每個通道用8位表示