gpt4 book ai didi

android - 在 fresco 中缓存 gif

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:27 24 4
gpt4 key购买 nike

我正在尝试用 gif 制作一个 recyclerview。一切都显示完美,但 Fresco 不缓存 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?

编辑:它看起来像 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);
}

最佳答案

为了让事情更清楚一点,Fresco 有 3 级缓存:

  • DiskCache - 以原始格式保存图像文件。 (成为精确,如果在不完全支持 webp 的 Android 版本上图片,它们可能会在存储前被转码为其他格式。)
  • EncodedMemoryCache - 以原始编码格式在内存中缓存图像。 (图像保存为原始字节的字节数组因为它们存储在磁盘上 + 一些额外的元数据。)
  • BitmapMemoryCache - 主要由 Android 位图组成的内存缓存。位图是解码后的图像,每个像素占32bits这比编码时需要的要多得多。

权衡显然是空间与时间。可用内存有限,如果图像不在位图缓存中,则必须重新解码。此外,如果它也不在编码内存缓存中,则必须从磁盘读取,这也可能很慢。

现在回到动画图像。这是一个已知的限制。动画图像不会以其解码形式缓存,因为这会耗尽位图缓存(只需乘以 num_frames * width * height * 32bpp)并且单个动画图像可能会逐出缓存中的所有其他图像。相反,它们会按需解码,并且只有几个即将显示的帧会保存在短暂的缓存中。

我们有一些改进动画的计划,但我无法提供任何时间估计。

关于android - 在 fresco 中缓存 gif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35014663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com