研究Fresco有段時間了,在內存使用上的確要比UIL的好挺多,但同時Fresco的使用也些許復雜,還有很多陷阱。
除了參看官方文檔外,還需要注意一下問題:
一、配置
1、ImagePipelineConfig 要設置 setDownsampleEnabled(true),以打開對png等圖片的自動縮放特性(縮放必須要設置ResizeOptions);
setResizeAndRotateEnabledForNetwork(),已對網絡圖也能進行resize處理,減少內存開銷;
沒有png等透明圖片的顯示要求,setBitmapsConfig設置為 RGB_565,減少內存開銷;
2、如果有瀏覽本地圖片的,并且一屏上顯示多張(> 9),要將PoolFactory的flexByteArrayPoolParams的PoolParam的 maxSizeHardCap值設為 8MB以上。
默認是每個讀取線程只有4MB的byte緩存池,但現在很多圖片的文件大小都超過8MB,在同時加載多種圖片時,容易出現緩存池大小不夠,導致加載失敗;
二、ImageRequest
1、加載文件路徑不要直接直接使用 Uri.parse(),而要使用 Uri.fromFIle()。parse不會轉義文件路徑的unicode字符,導致加載失敗;
2、ResizeOptions一定盡量要設置,并且是ImageView所顯示的大小,這樣可以盡可能的縮減加載的圖像尺寸,節約內存;
3、加載到BitmapCache的圖片都是帶Resize的,如果兩處加載同一個Uri,但ResizeOptions不同的話,那也是當做兩張圖片;
4、GIF圖閃動:Fresco是不在內存中緩存GIF圖的,每次顯示都是重新解碼,閃動可以設置ImageDecodeOption中的setDecodePReviewFrame(true),并不設置placeholder的圖片;
三、緩存
1、直接獲得內存緩存的Bitmap:
[java] view plain copy四、預加載
使用預加載時,要預加載到內存并解碼的,要注意ResizeOptions,和照片旋轉照成的長寬對調。
1、預緩存到本地文件,但不加載到內存,自動忽略ResizeOptions:
[java] view%20plain copy2、預加載到內存并解碼(不需要立即拿到結果的),受ResizeOptions影響:
[java] view%20plain copy4、
新聞熱點
疑難解答