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