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位表示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM