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

2024-01-09

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

问题:

  1. 是否有更干净的方法来实现以下目标:如果存在,则显示缓存中的 GIF 图像,否则下载 GIF,缓存它以供以后使用,并将其显示在ImageView.

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

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

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

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


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

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

您的代码将阻止 Glide 下载 GIF,并且仅显示已缓存的 GIF,这听起来像是您不希望的。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Glide:如何查找图像是否已缓存并使用缓存版本? 的相关文章

随机推荐

  • 安装后如何添加更多Qt版本?

    我已经安装了开源 Qt 5 5 0 设置如下 Kits Desktop Qt 5 4 2 MSVC2013 64bit2 Desktop Qt 5 5 0 MSVC2013 64bit Qt 版本 Qt 5 4 2 MSVC2013 64b
  • Rails - image.png 未预编译

    我正在尝试在 Amazon 的 EC2 服务器上部署 Web 应用程序 并且我将代码放在服务器上 一切看起来都正常 但是当我进入主页时 我收到一条 500 错误消息 并且production log文件给我以下错误 ActionView T
  • iPhone(SDK 2.2):在不主动使用 AVFoundation 播放音乐时调整播放音量?

    所以我有一个可以播放许多简短声音剪辑的应用程序 我需要知道声音何时播放完毕 并且我需要使用 mp3 因此我使用 AVFoundation 进行声音播放 当正在播放声音并且用户使用硬件音量按钮时 播放音量会发生变化 问题是 该应用程序不会不断
  • 在 Windows 8 应用程序中以编程方式使用 SSL 证书

    我需要这方面的帮助 我们的后端由自签名证书保护 我们称之为 OurMegaCool Certificate cer 因此 我们已使用以下命令将此证书导入到我们的开发人员机器中证书管理器MSC 现在我们可以使用以下代码从后端检索数据 asyn
  • 截取 BlackBerry 中当前屏幕的屏幕截图

    是否可以在 BlackBerry 应用程序中截取当前屏幕的屏幕截图 我的屏幕上有一个按钮 当我单击该按钮时 我想发送一封包含当前屏幕截图的电子邮件 您可以使用以下方法获取显示屏幕的屏幕截图 public static Bitmap getS
  • mvc 3会话和authorizeAttribute

    我的网站对所有人开放 但我有一个控制器 其中有某种方法 只有具有用户名和密码的管理员才能输入 我正在拯救布尔IsManager in a session 我想使用授权属性来阻止任何人IsManager false 首先定义一个ActionF
  • 以编程方式导航时,Angular Router 旧组件保留在 dom 中

    角度版本 4 从登录后LoginComponent 位于public signin路线 我想导航到TestComponent在路径中public test 我这样做如下 this router navigate public test 然后
  • CSS - 三个可滚动等高主要内容列(流体高度)和粘性/始终可见的页脚

    我几乎浏览了这里和 Google 上的所有帖子 似乎找不到关于 3 个等高列 带有 真正 粘性页脚 的 CSS 布局问题的答案 布局要求如下 顶部标题部分 其中一行用于下拉菜单选项 另一行用于工具栏按钮 主要内容部分 有 3 个等高的列 中
  • Javascript 相当于 Python 的 locals() 吗?

    在Python中 我们可以使用内置函数获取当前范围内所有局部和全局变量的字典locals and globals 在 Javascript 中是否有一些等效的方法可以做到这一点 例如 我想做如下的事情 var foo function al
  • 使用值和引用参数类型重载的方法

    我有以下代码 class Calculator public int Sum int x int y return x y public int Sum out int x out int y x y 10 return x y class
  • d3:画笔更改单击鼠标悬停

    我正在尝试结合画笔选择 工具提示和单击事件来创建散点图 但似乎一旦我将画笔添加到 svg 画布 对象上的所有单击事件都会映射到鼠标悬停 有没有办法解决 下面的示例代码和 http jsfiddle net 7j8cr http jsfidd
  • 端口 7071 不可用。关闭使用该端口的进程,或使用 --port [-p] 指定另一个端口

    我尝试从本地运行 azure 函数应用程序 Http Triggerd API 使用 VS 代码 但我收到错误 端口 7071 不可用 使用该端口关闭进程 或使用 port p 指定另一个端口 我使用cmd提示符检查了使用的端口列表 但是7
  • 如何将 NSUInteger 转换为 NSString?

    你如何转换NSUInteger进入一个NSString 我已经尝试过但是我的NSString一直返回0 NSUInteger NamesCategoriesNSArrayCount self NamesCategoriesNSArray c
  • 从命令提示符或 PowerShell 调用 MSYS2 Shell

    从命令提示符或 PowerShell 开始 两者都可以 我可以弄清楚如何执行另一个给定的操作 如何调用 MSYS2 shell 来运行命令 更具体的问题 我包含此信息是为了避免 XY 问题 但我坚信最好通过回答上述 更一般的 问题来解决这个
  • 外部函数调用不同的包注意

    我正在准备一个 R 包以提交给 CRAN R CMD 检查给了我以下注释 外部函数调用不同的包 Fortran cinc 包 cmprsk Fortran crstm PACKAGE cmprsk 看 Writing R 的 系统和外语界面
  • 从 C# LINQ 解析 XML 时如何保留空白字符

    我需要在 C 代码或 XML 文档中做什么 以便 XDocument 解析器读取文字空白Values of XElements Background 我有一个 XML 文档 其中一部分如下所示
  • $settings 数组或 Config 类来存储项目设置?

    我应该如何存储项目设置 哪个更好 使用 settings包含我所有设置的数组 settings max photos 30 或创建一个单例Config类中包含所有设置 Class Config private max photos 30 有
  • linux top 显示java线程?

    在Linux服务器 fedora 中 我们运行单个JBOSS应用程序服务器 并使用quartz来调度我们的任务 昨天 我使用 top 命令来查看进程状态 查看多个名为Java显示不同的pid 但是如果我使用 ps aux grep java
  • 在滚动条到达底部之前执行 100px 的操作

    我有下面的 Javascript 当滚动条到达页面底部时 警报就会按预期显示 但是 我希望这发生在 100 像素处before它到达底部 我该怎么做呢 window scroll function if window scrollTop d
  • Glide:如何查找图像是否已缓存并使用缓存版本?

    Scenario 我有一个大的 GIF 图像 我想在用户第一次使用它打开应用程序时缓存该图像Glide https github com bumptech glide 图像加载和缓存库 之后 每当用户打开应用程序时 我想显示缓存的版本 如果