【问题标题】:Android - How to get image file from Fresco disk cache?Android - 如何从 Fresco 磁盘缓存中获取图像文件?
【发布时间】:2015-04-21 12:59:55
【问题描述】:

我正在使用Fresco 库。

我在 Fresco 文档中找不到任何相关信息, 如何从 Fresco 的磁盘缓存中获取图像文件?

【问题讨论】:

  • 虽然我无法回答您的问题,但我很好奇您为什么要使用这个全新的库而不是 Glide 或 Picasso,因为它们的文档已经足够好了?
  • @Stan 我也对答案感兴趣,因为我决定尝试那个库。为什么?因为它提供了一些毕加索没有的有趣功能,例如progressive JPEG streaming
  • 1.是的,我们使用的是渐进式 JPEG。 2. 是新的。所有新事物都很有趣)
  • 嗯,实际上它对我来说也很有趣,因为它有一些原生实现,如 JPEG/PNG 解码器和其他功能。但是,我在一个项目中尝试过它与 UIL 的对比,而使用 UIL,它在滚动时在 ListView 中具有更好的性能。使用 Glide,Picasso 和 Fresco List 在滚动时滞后,但不使用 UIL。必须说,这些库都没有从缓存中获取图像文件的正常方法。它总是一些棘手的方法,对于 UIL 也是如此。
  • 顺便说一句,使用frescolib.org/docs/… 我们可以获得压缩图像。它实际上就像一个图像文件的内容。

标签: java android image-caching fresco


【解决方案1】:

如果图片在缓存中有下载,你可以这样做:

ImageRequest imageRequest=ImageRequest.fromUri(url);
CacheKey cacheKey=DefaultCacheKeyFactory.getInstance()
     .getEncodedCacheKey(imageRequest);
BinaryResource resource = ImagePipelineFactory.getInstance()
     .getMainDiskStorageCache().getResource(cacheKey);
File file=((FileBinaryResource)resource).getFile();

【讨论】:

  • 我收到错误:“无法解析getMainDiskStorageCache()
  • 请注意,这种方法会在 Kotlin 中返回文件的编码版本,代码如下:ImagePipelineFactory.getInstance().mainFileCache.getResource(cacheKey
【解决方案2】:

希望对你有帮助

在此链接上查看 Plamenkos 的答案。https://github.com/facebook/fresco/issues/80

如果您向管道请求编码图像,并使用 ImageRequestBuilder.setLowestPermittedRequestLevel 指定 DISK_CACHE,如果在磁盘缓存的任何位置找到图像,则管道将返回 JPEG 字节,如果未找到图像并且完整-fetch 必须执行。

希望我没有误解您的问题并提供了错误的答案。

【讨论】:

    【解决方案3】:
    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(YourImageUrl))
                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)
                .setResizeOptions(new ResizeOptions(width, width))
                .build();
    DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setOldController(YourImageView.getController())
                .setImageRequest(request)
                .build(); 
    

    这段代码:

    .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)

    将使 fresco 先从磁盘获取图像,然后再从网络获取图像。

    【讨论】:

    • 对不起,有那么一分钟我把你的答案搞砸了。但它帮助我理解了,所以谢谢!
    【解决方案4】:

    我认为您永远不应该尝试获取 Fresco Cache 名称,因为缓存是内部实现。

    但是如果你想知道一张图片是否被缓存了,你可以使用这个:

    private boolean isDownloaded(Uri loadUri) {
        if (loadUri == null) {
            return false;
        }
        ImageRequest imageRequest = ImageRequest.fromUri(loadUri);
        CacheKey cacheKey = DefaultCacheKeyFactory.getInstance()
                .getEncodedCacheKey(imageRequest);
        return ImagePipelineFactory.getInstance()
                .getMainDiskStorageCache().hasKey(cacheKey);
    }
    

    这个方法返回速度很快,可以在UI线程中使用。

    【讨论】:

    • 快于 '.setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)' ??
    【解决方案5】:
     private fun getGitFile(gifUrl: String): File {
            val request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(gifUrl))
                    .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)
                    .build()
            val cacheKey = DefaultCacheKeyFactory.getInstance()
                    .getEncodedCacheKey(request, null)
            val resource = ImagePipelineFactory.getInstance()
                    .mainFileCache.getResource(cacheKey)
            val file = (resource as FileBinaryResource).file
            return file
        }
    

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 2016-01-29
      • 2016-09-30
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多