Glide OOM問題解決方法彙總
阿新 • • 發佈:2019-01-27
1、引入largeHeap屬性,讓系統為App分配更多的獨立記憶體。
2、禁止Glide記憶體快取。設定skipMemoryCache(true)。
3、自定義GlideModule。設定MemoryCache和BitmapPool大小。
4、升級到Glide4.0,使用asDrawable代替asBitmap,drawable更省記憶體。
5、ImageView的scaleType為fitXY時,改為fitCenter/centerCrop/fitStart/fitEnd顯示。
6、不使用application作為context。當context為application時,會把imageView是生命週期延長到整個執行過程中,imageView不能被回收,從而造成OOM異常。
7、使用application作為context。但是對ImageView使用弱引用或軟引用,儘量使用SoftReference,當記憶體不足時,將及時回收無用的ImageView。
8、當列表在滑動的時候,呼叫Glide的pauseRequests()取消請求,滑動停止時,呼叫resumeRequests()恢復請求。
9、Try catch某些大記憶體分配的操作。考慮在catch裡面嘗試一次降級的記憶體分配操作。例如decode bitmap的時候,catch到OOM,可以嘗試把取樣比例再增加一倍之後,再次嘗試decode。
10、BitmapFactory.Options和BitmapFactory.decodeStream獲取原始圖片的寬、高,繞過Java層載入Bitmap,再呼叫Glide的override(width,height)控制顯示。
11、圖片區域性載入。參考:SubsamplingScaleImageView,先將圖片下載到本地,然後去載入,只加載當前可視區域,在手指拖動的時候再去載入另外的區域。
2、禁止Glide記憶體快取。設定skipMemoryCache(true)。
3、自定義GlideModule。設定MemoryCache和BitmapPool大小。
4、升級到Glide4.0,使用asDrawable代替asBitmap,drawable更省記憶體。
5、ImageView的scaleType為fitXY時,改為fitCenter/centerCrop/fitStart/fitEnd顯示。
6、不使用application作為context。當context為application時,會把imageView是生命週期延長到整個執行過程中,imageView不能被回收,從而造成OOM異常。
7、使用application作為context。但是對ImageView使用弱引用或軟引用,儘量使用SoftReference,當記憶體不足時,將及時回收無用的ImageView。
8、當列表在滑動的時候,呼叫Glide的pauseRequests()取消請求,滑動停止時,呼叫resumeRequests()恢復請求。
9、Try catch某些大記憶體分配的操作。考慮在catch裡面嘗試一次降級的記憶體分配操作。例如decode bitmap的時候,catch到OOM,可以嘗試把取樣比例再增加一倍之後,再次嘗試decode。
10、BitmapFactory.Options和BitmapFactory.decodeStream獲取原始圖片的寬、高,繞過Java層載入Bitmap,再呼叫Glide的override(width,height)控制顯示。
11、圖片區域性載入。參考:SubsamplingScaleImageView,先將圖片下載到本地,然後去載入,只加載當前可視區域,在手指拖動的時候再去載入另外的區域。