我正在尝试使用gif制作一个recyclerview。所有东西都显示得很完美,但fresco不能缓存gif。在向下滚动recycler并再次向上滚动后,gif再次加载。我想他们应该被缓存并且加载速度会更快一些。以前我使用过ION库。加载速度更快,而且没有缓存问题。我不得不更换库,因为它与gif解码有些问题,描述在这里。目前的解决方案看起来是这样的:
//for default initial in application class
Fresco.initialize(this);
//I have also tried to change DiskCacheConfig and ImagePipelineConfig params.
//Without any positive result
//for recyclerview on onBindViewHolder
GenericDraweeHierarchy hierarchy = holder.draweeView.getHierarchy();
Uri uri = Uri.parse(path);
hierarchy.setPlaceholderImage(R.drawable.img_bg);
Logger.e(check(uri) + " " + uri.toString());
DraweeController controller = Fresco.newDraweeControllerBuilder().setUri(uri)
.setAutoPlayAnimations(true).build();
holder.draweeView.setController(controller);
//for method which show cached uri images in imagepipeline
public static boolean check(Uri uri) {
ImagePipeline imagePipeline = Fresco.getImagePipeline();
return imagePipeline.isInBitmapMemoryCache(uri);
}
//... all the time log shows "false + gif url"
我没有看到关于不缓存动画图片的任何信息。有关动画图像的不支持的后处理信息,但这就是全部内容。如何正确地缓存gif?
编辑: 看起来Fresco可以缓存动画,因为下面的方法对于重新加载的gif返回true。
public static boolean isImageDownloaded(Uri loadUri) {
if (loadUri == null) {
return false;
}
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance()
.getEncodedCacheKey(ImageRequest.fromUri(loadUri));
return ImagePipelineFactory.getInstance().getMainDiskStorageCache().hasKey(cacheKey)
|| ImagePipelineFactory.getInstance().getSmallImageDiskStorageCache()
.hasKey(cacheKey);
}