首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ViewPager 載入大量圖片 OOM 解決:使用 inSampleSize 壓縮解碼

     編輯:程式設計綜合問答

問題現象

`ViewPager` 中 `instantiateItem` 直接 `BitmapFactory.decodeStream` 載入原圖,滑動幾頁後發生 `OutOfMemoryError`。`destroyItem` 雖呼叫 `recycle()` 但來不及回收。

核心解決:解碼時壓縮

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2; // 寬高各縮半,面積減為 1/4
Bitmap bmp = BitmapFactory.decodeStream(is, null, opts);

進階最佳化建議

  1. 動態計算 inSampleSize:根據 `ImageView` 實際顯示尺寸與原圖尺寸比例,計算最接近的 2 的冪次方。
  2. 使用成熟圖片庫:Glide、Picasso、Coil (Kotlin) 自動處理壓縮、快取、生命週期、預載入,極大降低 OOM 風險。
  3. 啟用硬體加速:`android:hardwareAccelerated="true"` (API 14+ 預設開啟)。
  4. 設定大記憶體:`android:largeHeap="true"` (謹慎使用,僅緩解不解決根本)。

Glide 範例 (推薦)

Glide.with(context)
     .load(imagePath)
     .override(targetWidth, targetHeight) // 限制最大尺寸
     .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
     .into(imageView);

總結

手動 `inSampleSize` 可快速緩解,長期專務請遷移至成熟圖片載入庫,專注業務邏輯而非記憶體管理細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved