首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >幻灯片:如何查找图像是否已经缓存并使用缓存版本?

幻灯片:如何查找图像是否已经缓存并使用缓存版本?
EN

Stack Overflow用户
提问于 2015-09-04 12:57:47
回答 2查看 43.6K关注 0票数 32

场景

我有一个大的GIF图像,我想缓存第一次用户使用滑行 -图像加载和缓存库打开应用程序。之后,每当用户打开应用程序,我想显示缓存的版本,如果有。此GIF URL将在给定间隔后过期。当它到期时,我将获取新的GIF URL并显示/缓存它以供将来使用。

我尝试了什么:

我在幻灯片的github页面上浏览了缓存与缓存失效。我还浏览了Google线程确保加载的图像仅来自磁盘缓存,它展示了如何获取图像表单缓存。我还讨论了如何使特定图像的Glide缓存失效的问题。

从上面的链接中,我看到了下面的代码片段,它显示了如何从缓存加载图像。但是,这只会尝试从缓存中获取图像。如果它不在缓存中,则不会尝试从网络获取,并且失败:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Glide.with(TheActivity.this)
        .using(new StreamModelLoader<String>() {
            @Override
            public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) {
                return new DataFetcher<InputStream>() {
                    @Override
                    public InputStream loadData(Priority priority) throws Exception {
                        throw new IOException();
                    }

                    @Override
                    public void cleanup() {
                    }

                    @Override
                    public String getId() {
                        return model;
                    }

                    @Override
                    public void cancel() {
                    }
                };
            }
        })
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);

问题:

  1. 是否有一种更干净的方法来实现以下功能:在缓存中显示GIF映像(如果有其他的话),下载GIF,缓存它供以后使用,然后在ImageView中显示它。
  2. 上面的缓存文章提到了以下内容: 在实践中,使缓存文件失效的最佳方法是在内容更改时更改标识符(url、uri、文件路径等)。

当上一个URL过期时,服务器会向应用程序发送不同的URL。在这种情况下,我相信旧的形象最终会被垃圾收集吗?有办法强制从缓存中删除图像吗?

  1. 类似地,是否有一种方法可以防止具有特定密钥的图像的垃圾收集(防止再次下载大文件),然后指示在URL更改时从缓存中删除旧图像?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-09 07:16:24

  1. 您不需要定制的ModelLoader来显示缓存中的GIF,如果存在,否则就获取它,这实际上是Glide的默认行为。仅仅使用标准载重线应该可以正常工作: Glide.with(TheActivity.this) .load("http://sampleurl.com/sample.gif") .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(theImageView);

您的代码将防止幻灯片下载GIF,并且只有在GIF已经被缓存时才会显示GIF,这听起来像是您不想要的。

  1. 是的,旧的图像最终会被删除。默认情况下,幻灯片使用LRU缓存,因此当缓存已满时,将删除最近使用最少的图像。如果需要,您可以轻松地自定义缓存的大小,以帮助实现这一点。有关如何更改缓存大小,请参见配置 wiki页面。
  2. 不幸的是,没有任何方法直接影响缓存的内容。不能显式删除项,也不能强制保留项。在实际使用适当的磁盘缓存大小时,您通常不需要担心这两种情况。如果你经常显示你的图像,它不会被驱逐。如果您尝试缓存其他项并在缓存中耗尽空间,则会自动将旧项解压缩以生成空间。
票数 40
EN

Stack Overflow用户

发布于 2017-11-01 03:30:13

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Glide.with(context)
 .load("http://sampleurl.com/sample.gif")
 .skipMemoryCache(true)
 .into(imageView);

您已经注意到,我们调用了.skipMemoryCache(true),专门告诉Glide跳过内存缓存。这意味着幻灯片将不会将图像放在内存缓存中。重要的是要理解,这只会影响内存缓存!滑动仍然将利用磁盘缓存,以避免另一个网络请求下一个请求到相同的图像URL.for更多地读取此滑动缓存&请求优化

编码愉快!!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32406489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文