Fresco 使用要点

研究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
  在CODE上查看代码片 派生到我的代码片
  1. DataSource<CloseableReference<CloseableImage>> dataSource =  
  2.         Fresco.getImagePipeline().fetchImageFromBitmapCache(request, null);  
  3. CloseableReference<CloseableImage> imageReference = null;  
  4. try {  
  5.     imageReference = dataSource.getResult();  
  6.     if (imageReference != null) {  
  7.         CloseableImage image = imageReference.get();  
  8.         // do something on this  
  9.     }  
  10. finally {  
  11.     dataSource.close();  
  12.     CloseableReference.closeSafely(imageReference);  
  13. }  


四、预加载

使用预加载时,要预加载到内存并解码的,要注意ResizeOptions,和照片旋转照成的长宽对调。


1、预缓存到本地文件,但不加载到内存,自动忽略ResizeOptions:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Fresco.getImagePipeline()  
  2.                 .prefetchToDiskCache(imageRequest, null)  

2、预加载到内存并解码(不需要立即拿到结果的),受ResizeOptions影响:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Fresco.getImagePipeline()  
  2.                 .prefetchToBitmapCache(imageRequest, null)  

3、加载一张图片,并缓存到内存,返回解码的结果,受ResizeOptions影响:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Fresco.getImagePipeline()  
  2.                 .fetchDecodedImage(imageRequest, null)  
但要注意,返回的DataSource是不能直接拿到结果,需要subscribe DataSource

4、

猜你喜欢

转载自blog.csdn.net/guankai1990/article/details/54948704
今日推荐