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

Sho*_*uri 25 android image-caching android-glide

场景:

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

我尝试了什么:

我在Glide的github页面上浏览了Caching和Cache Invalidation.我还去了谷歌集团的线程确保加载的图像仅来自磁盘缓存,它显示了如何获取图像格式缓存.我还经历了如何使某些特定图像问题的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);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 是否有更简洁的方法来实现以下功能:如果存在,则从缓存中显示GIF图像,然后下载GIF,将其缓存以供以后使用并在中显示ImageView.

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

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

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

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

Sam*_*udd 34

  1. 如果存在,您不需要自定义ModelLoader来显示缓存中的GIF,否则就会获取它,这实际上是Glide的默认行为.只需使用标准负载线就可以正常工作:

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

您的代码将阻止Glide下载GIF,并且只有在已经缓存的情况下才显示GIF,这听起来是您不想要的.

  1. 是的,旧图像最终将被删除.默认情况下,Glide使用LRU缓存,因此当缓存已满时,将删除最近最少使用的图像.如果需要,您可以轻松自定义缓存大小以帮助实现此目的.有关如何更改缓存大小的信息,请参阅" 配置 Wiki"页面.

  2. 不幸的是,没有任何方法可以直接影响缓存的内容.您不能显式删除项目,也不能强制保留项目.在实际使用适当的磁盘高速缓存大小时,通常无需担心这两种情况.如果您经常显示图像,则不会被逐出.如果您尝试缓存其他项目并且缓存中的空间不足,则会自动逐出旧项目以腾出空间.