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