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

Android Gallery 顯示重複 Bitmap 且 recycle 導致崩潰的根因與修復

     編輯:程式設計綜合問答

現象

Gallery 適配器中多次調用 GetBMP() 獲取 Bitmap,但顯示的圖片全相同;嘗試 bitmap.recycle() 釋放內存卻導致 App 閃退。

根因分析

  1. 同一 Bitmap 對象被重複引用:GetBMP() 每次返回同一 contentLayout 的繪圖緩存 getDrawingCache(),未創建獨立副本。
  2. recycle() 後繼續使用:Gallery 復用 View 時,已回收的 Bitmap 被再次設置到 ImageView,觸發 Canvas: trying to use a recycled bitmap 崩潰。

修正方案

// 1. 為每個項目創建獨立 Bitmap 副本
public Bitmap GetBMP(int position) {
    // 根據 position 加載對應資源/網絡圖片
    return BitmapFactory.decodeResource(getResources(), resIds[position]);
}

// 2. 適配器中持有 Bitmap 列表或使用圖片加載庫
// 推薦:Glide/Picasso 自動管理生命週期,無需手動 recycle
Glide.with(context).load(urls[position]).into(imageView);

最佳實踐

  • 棄用 Gallery(API 16 棄用),改用 RecyclerView + LinearLayoutManager.HORIZONTAL。
  • 所有圖片加載統一接入 Glide,配置 diskCacheStrategy、override 尺寸,彻底避免 OOM 與 recycle 崩潰。
  • 若必須手動管理,使用 LruCache 緩存 Bitmap,onDestroy 統一清理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved