我正在尝试使用GIF进行回收查看.一切都显示完美,但壁画不缓存GIF.向下滚动回收器并再次向上滚动后,再次加载GIF.我认为它们应该被缓存并加载更快一点.以前我使用过 ION library.加载速度更快,没有缓存问题.我不得不改变lib,因为它有一些gif解码的问题,描述了 here.当前的解决方案看起来像这样:
//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?
编辑:
它看起来像壁画缓存动画,因为下面的方法返回true重新加载的GIF.
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);
}
最佳答案 为了让事情更加清晰,Fresco有3个级别的缓存:
> DiskCache – 以原始格式保留图像文件. (成为
精确,如果在Android版本上不完全支持webp
图像,它们可以在存储之前转码为其他格式.)
> EncodedMemoryCache – 以原始编码格式存储的图像内存缓存. (图像保存为原始字节的字节数组
因为它们存储在磁盘上一些额外的元数据.)
> BitmapMemoryCache – 主要由Android位图组成的内存缓存.位图是解码图像,每个像素占用32位
这比编码时要多得多.
权衡显然是空间与时间的关系.可用内存有限,如果图像不在位图缓存中,则必须再次进行解码.此外,如果它不在编码的存储器高速缓存中,则必须从磁盘读取它也可能很慢.
现在回到动画图像.这是一个已知的限制.动画图像不会以其解码形式进行缓存,因为这会耗尽位图缓存(只需将num_frames * width * height * 32bpp相乘),并且单个动画图像可能会逐出缓存中的每个其他图像.相反,它们是按需解码的,只有几个即将显示的帧保存在短期缓存中.
虽然我无法提供任何时间估算,但我们有一些计划来改进动画.