本教程內(nèi)容來(lái)源于:http://fresco-cn.org
采用 知識(shí)共享 署名 4.0 國(guó)際 許可協(xié)議 進(jìn)行許可
本頁(yè)介紹Image pipeline的高級(jí)用法,大部分的應(yīng)用使用Drawees 和image pipeline打交道就好了。
直接使用Image pipeline是較為有挑戰(zhàn)的事情,這意味著要維護(hù)圖片的內(nèi)存使用。Drawees 會(huì)根據(jù)各種情況確定圖片是否需要在內(nèi)存緩存中,在需要時(shí)加載,在不需要時(shí)移除。直接使用的話,你需要自己完成這些邏輯。
Image pipeline返回的是一個(gè)CloseableReference對(duì)象。在這些對(duì)象不需要時(shí),Drawees會(huì)調(diào)用.close()方法。如果你的應(yīng)用不使用Drawees,那你需要自己完成這個(gè)事情。
Java的GC機(jī)制會(huì)在Bitmap不使用時(shí),清理掉Bitmap。但要GC時(shí)總是太遲了,另外GC是很昂貴的開(kāi)銷(xiāo)。GC大對(duì)象也會(huì)帶來(lái)性能問(wèn)題,尤其是在5.0以下系統(tǒng)。
首先創(chuàng)建一個(gè)image request. 然后傳遞給 ImagePipeline:
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>>
dataSource = imagePipeline.fetchDecodedImage(imageRequest);
關(guān)于如果接收數(shù)據(jù),請(qǐng)參考數(shù)據(jù)源 章節(jié)。
如果你不保持圖片原始格式,不執(zhí)行解碼,使用fetchEncodedImage即可:
DataSource<CloseableReference<PooledByteBuffer>>
dataSource = imagePipeline.fetchEncodedImage(imageRequest);
不像其他緩存,如果圖片在內(nèi)存緩存中有的話,可以在UI線程立刻拿到結(jié)果。
DataSource<CloseableReference<CloseableImage>> dataSource =
mImagePipeline.fetchImageFromBitmapCache(imageRequest);
CloseableReference<CloseableImage> imageReference;
try {
imageReference = dataSource.getResult();
if (imageReference != null) {
CloseableImage image = imageReference.get();
// do something with the image
}
} finally {
dataSource.close();
CloseableReference.closeSafely(imageReference);
}
千萬(wàn) 不要 省略掉 finally 中的代碼!
預(yù)加載圖片可減少用戶等待的時(shí)間,如果預(yù)加載的圖片用戶沒(méi)有真正呈現(xiàn)給用戶,那么就浪費(fèi)了用戶的流量,電量,內(nèi)存等資源了。大多數(shù)應(yīng)用,并不需要預(yù)加載。
Image pipeline 提供兩種預(yù)加載方式。
預(yù)加載到文件緩存:
imagePipeline.prefetchToDiskCache(imageRequest);
預(yù)加載到內(nèi)存緩存:
imagePipeline.prefetchToBitmapCache(imageRequest);