幾乎全部的 OOM 錯誤都是由於宿主應用出了問題,而不是 Glide 自己。 應用裏兩種常見的 OOM 錯誤分別是:
過大的內存分配 (Excessively large allocations)
內存泄露(Memory leaks, 被分配的內存沒有被釋放)緩存
- 引入largeHeap屬性,讓系統爲App分配更多的獨立內存。
- 禁止Glide內存緩存。設置skipMemoryCache(true)。
- 自定義GlideModule。設置MemoryCache和BitmapPool大小。
- 升級到Glide4.0,使用asDrawable代替asBitmap,drawable更省內存。
- ImageView的scaleType爲fitXY時,改成fitCenter/centerCrop/fitStart/fitEnd顯示。
- 不使用application做爲context。當context爲application時,會把imageView是生命週期延長到整個運行過程當中,imageView不能被回收,從而形成OOM異常。
- 使用application做爲context。可是對ImageView使用弱引用或軟引用,儘可能使用SoftReference,當內存不足時,將及時回收無用的ImageView。
- 當列表在滑動的時候,調用Glide的pauseRequests()取消請求,滑動中止時,調用resumeRequests()恢復請求。
if (view.getContext() != null) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
Glide.with(view.getContext()).resumeRequests();
break;
case SCROLL_STATE_TOUCH_SCROLL:
case SCROLL_STATE_FLING:
Glide.with(view.getContext()).pauseRequests();
break;
}
}
- Try catch某些大內存分配的操做。考慮在catch裏面嘗試一次降級的內存分配操做。例如decode bitmap的時候,catch到OOM,能夠嘗試把採樣比例再增長一倍以後,再次嘗試decode。
- BitmapFactory.Options和BitmapFactory.decodeStream獲取原始圖片的寬、高,繞過Java層加載Bitmap,再調用Glide的override(width,height)控制顯示。
- 圖片局部加載。參考:SubsamplingScaleImageView,先將圖片下載到本地,而後去加載,只加載當前可視區域,在手指拖動的時候再去加載另外的區域。
- onTrimMemory,調用 Glide.cleanMemroy() 清理掉全部的內存緩存。(內部是LruBitmapPool )
- 若是是處於 lowMemory 的時候,將圖片的 DecodeFormat 設置爲 RGB_565
- 使用glide本身的圓角圖片。bitmapTransfrom