Scenario:
我有一个大的 GIF 图像,我想在用户第一次使用它打开应用程序时缓存该图像Glide https://github.com/bumptech/glide- 图像加载和缓存库。之后,每当用户打开应用程序时,我想显示缓存的版本(如果存在)。此 GIF URL 将在给定的时间间隔后过期。当它过期时,我会获取新的 GIF URL 并显示/缓存以供将来使用。
我尝试过的:
我经历了缓存和缓存失效 https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation在 Glide 的 github 页面上。我还浏览了 Google Group 线程确保加载的图像仅来自磁盘缓存 https://groups.google.com/forum/#!topic/glidelibrary/TcFOy0tcxXA,它展示了如何获取图像表单缓存。我也经历过如何使某些特定图像的 Glide 缓存失效 https://stackoverflow.com/questions/31537669/how-to-invalidate-glide-cache-for-some-specific-images问题。
从上面的链接我看到以下代码片段,它显示了如何从缓存加载图像。然而,这只尝试从缓存中获取图像。如果缓存中不存在,则不会尝试从网络获取并失败:
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 更改时从缓存中删除旧图像?
-
您不需要自定义 ModelLoader 来显示缓存中的 GIF(如果存在)并获取它,否则,这实际上是 Glide 的默认行为。只需使用标准负载线就可以正常工作:
Glide.with(TheActivity.this)
.load("http://sampleurl.com/sample.gif")
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(theImageView);
您的代码将阻止 Glide 下载 GIF,并且仅显示已缓存的 GIF,这听起来像是您不希望的。
是的,旧图像最终将被删除。默认情况下,Glide 使用 LRU 缓存,因此当缓存已满时,最近最少使用的图像将被删除。如果需要,您可以轻松自定义缓存的大小以帮助实现此目的。请参阅配置 https://github.com/bumptech/glide/wiki/Configuration#size有关如何更改缓存大小的 wiki 页面。
不幸的是,没有任何方法可以直接影响缓存的内容。您不能显式删除某项,也不能强制保留一项。在实践中,使用适当的磁盘缓存大小,您通常不需要担心这样做。如果您足够频繁地显示图像,它就不会被驱逐。如果您尝试缓存其他项目并耗尽缓存空间,较旧的项目将被自动驱逐以腾出空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)