Android面試題:大圖載入,防止OOM
阿新 • • 發佈:2020-07-16
這是位元組面試官問的一個問題,平時Glide用慣了,讓我說大圖載入原理答不上來。
大圖如果直接載入到記憶體,往往會導致OOM,因為大圖所佔記憶體非常大。
Bitmap直接載入
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);
直接從資源中載入,方法非常簡單,拿到Bitmap物件然後塞入ImageView中即可。這方式小圖片還能正常載入,大圖片就有問題了。
大圖載入步驟
- 獲取大圖尺寸
- 獲取ImageVIew的尺寸,縮放減小記憶體
- 載入
大圖尺寸獲取
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);
執行結果可以看到bitmap並未載入,而是獲取到了圖片的大小:outHeight和outWidth
減小記憶體
- 根據ImageView大小計算縮放比例inSampleSize
- 選擇佔記憶體小的顏色模式,設定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位表示 |