廖祜秋 · 更新于 2018-11-28 11:00:42

直接使用Image Pipeline

本教程内容来源于:http://fresco-cn.org
采用 知识共享 署名 4.0 国际 许可协议 进行许可

本页介绍Image pipeline的高级用法,大部分的应用使用Drawees 和image pipeline打交道就好了。

直接使用Image pipeline是较为有挑战的事情,这意味着要维护图片的内存使用。Drawees 会根据各种情况确定图片是否需要在内存缓存中,在需要时加载,在不需要时移除。直接使用的话,你需要自己完成这些逻辑。

Image pipeline返回的是一个CloseableReference对象。在这些对象不需要时,Drawees会调用.close()方法。如果你的应用不使用Drawees,那你需要自己完成这个事情。

Java的GC机制会在Bitmap不使用时,清理掉Bitmap。但要GC时总是太迟了,另外GC是很昂贵的开销。GC大对象也会带来性能问题,尤其是在5.0以下系统。

调用 pipeline

首先创建一个image request. 然后传递给 ImagePipeline:

ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>> 
    dataSource = imagePipeline.fetchDecodedImage(imageRequest);

关于如果接收数据,请参考数据源 章节。

忽略解码

如果你不保持图片原始格式,不执行解码,使用fetchEncodedImage即可:

DataSource<CloseableReference<PooledByteBuffer>> 
    dataSource = imagePipeline.fetchEncodedImage(imageRequest);

从Bitmap缓存中立刻取到结果

不像其他缓存,如果图片在内存缓存中有的话,可以在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 中的代码!

预加载图片

预加载图片可减少用户等待的时间,如果预加载的图片用户没有真正呈现给用户,那么就浪费了用户的流量,电量,内存等资源了。大多数应用,并不需要预加载。

Image pipeline 提供两种预加载方式。

预加载到文件缓存:

imagePipeline.prefetchToDiskCache(imageRequest);

预加载到内存缓存:

imagePipeline.prefetchToBitmapCache(imageRequest);