当前位置: 首页 > 知识库问答 >
问题:

滑动:如何查找图像是否已缓存并使用缓存版本?

宰父正真
2023-03-14

情景:

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

我尝试了什么:

我在Glide的github页面上进行了缓存和缓存失效。我还浏览了Google Group线程确保加载的图像仅来自磁盘缓存,该线程显示了如何获取图像表单缓存。我还介绍了 如何使某些特定图像的Glide缓存无效 问题。

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

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);

问题:

>

  • 有没有一种更简洁的方法来实现以下目标:如果存在,请从缓存中显示GIF图像,否则请下载GIF,缓存它以供以后使用,并在ImageView中显示它。

    上面的缓存文章提到了以下内容:

    实际上,使缓存文件失效的最佳方法是在内容更改时更改标识符(url,uri,文件路径等)

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

    同样,有没有办法防止使用特定键的图像的垃圾收集(以防止再次下载大文件),然后在URL更改时指示从缓存中删除旧图像?

  • 共有2个答案

    颛孙高义
    2023-03-14
     Glide.with(context)
     .load("http://sampleurl.com/sample.gif")
     .skipMemoryCache(true)
     .into(imageView);
    

    您已经注意到我们调用了. skipMemoryCache(true)来特别告诉Glide跳过内存缓存。这意味着Glide不会将映像放在内存缓存中。重要的是要理解,这只会影响内存缓存!Glide仍然会利用磁盘缓存来避免对同一映像的下一个请求的另一个网络请求URL.for更多阅读此Glide缓存

    快乐编码!!

    梁兴修
    2023-03-14

    >

  • 您不需要自定义ModelLoader来显示缓存中的GIF(如果存在)并以其他方式获取它,这实际上是Glide的默认行为。只需使用标准加载行就可以正常工作:

    Glide.with(TheActivity.this)
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);
    

    您的代码将阻止Glide下载GIF,并且仅在GIF已被缓存的情况下显示GIF,这听起来像是您不想要的。

    是的,旧图像最终将被删除。默认情况下,Glide使用LRU缓存,因此当缓存已满时,最近最少使用的图像将被删除。如果您愿意,您可以轻松自定义缓存的大小以帮助实现这一点。有关如何更改缓存大小,请参阅配置wiki页面。

    不幸的是,没有任何方法可以直接影响缓存的内容。您既不能显式删除项,也不能强制保留项。在实践中,使用适当的磁盘缓存大小,您通常不需要担心这样做。如果您足够频繁地显示图像,它将不会被逐出。如果您尝试缓存其他项目,但缓存中的空间不足,则会自动清除旧项目以腾出空间。

  •  类似资料:
    • WordPress的示例短代码: 现在在上面的短代码中。代码中使用了一个图像。我想要获得图像,并在服务器中创建一个缓存,这样每个使用这个短代码的人都可以查看图像。目前,我正在使用base64编码的图像。

    • void is_cached(string template, [string cache_id]) This returns true if there is a valid cache for this template. This only works if caching is set to true. 在指定模板的缓存存在是返回真。只有在缓存设置为真时才可用。 Example 13-18

    • 问题内容: 我想在Redis中实现绝对缓存和滑动缓存。没有人有任何资源链接,这将是有帮助的 问题答案: Redis已经为此提供了许多命令: 到期:设置密钥超时。 期望值:与以前相同,但是需要一个绝对的Unix时间戳(自1970年1月1日以来的秒数)。 TTL:返回具有超时功能的键的剩余生存时间 您必须了解有关Redis过期的重要一件事:仅当使用SET或GETSET移除或覆盖键时,才会清除超时值。所

    • 问题内容: 它可能是实现细节,但是对于Oracle和IBM JDK而言,至少是对已编译模式进行了缓存,还是作为应用程序开发人员我们需要自己对已编译模式进行缓存? 问题答案: 我不认为结果会被缓存,并且代码或文档中也没有这种行为的证据。自己实现这样的缓存(当然)是比较琐碎的,但是我对这样的缓存很有用的用例感兴趣。 回覆。下面的注释和String.split(),有一种不同的方法,即代码采用简单的1或

    • 问题内容: 我和我的朋友们在一个网站上工作,我们希望在其中缓存某些图像,以便将来更快地显示它们。我有两个主要问题: 您如何缓存图像? 图像被缓存后如何使用?(只是为了验证图像是否在页面A上缓存,可以从缓存中调用它以在页面B上使用它,对吗?) 此外,有可能设置 时, 图像的缓存版本将到期? 如果包括示例和/或进一步描述页面的链接,将不胜感激。 使用原始Javascript或jQuery版本都可以。

    • 问题内容: 我对如何缓存图像是全新的。 我使用PHP输出图库中的所有图像,并希望已显示的图像由浏览器缓存,因此PHP脚本不必再次输出相同的图像。我想要的只是图像显示得更快。 调用图像时,我喜欢这样: 和-file做: 问题答案: 如果您使用php在输出消息之前检查用户是否已登录,则您不希望浏览器缓存图像。 缓存的全部目的是调用服务器一次,然后再也不调用它。如果浏览器缓存图像,它将不会调用服务器,并