前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?

Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?

作者头像
Carson.Ho
发布于 2019-02-22 07:20:23
发布于 2019-02-22 07:20:23
2.1K00
代码可运行
举报
文章被收录于专栏:Android知识分享Android知识分享
运行总次数:0
代码可运行

前言

  • Glide,该功能非常强大 Android 图片加载开源框架 相信大家并不陌生
  • 正由于他的功能强大,所以它的源码非常复杂,这导致很多人望而却步
  • 本人尝试将 Glide 的功能进行分解,并单独针对每个功能进行源码分析,从而降低Glide源码的复杂度。 接下来,我将推出一系列关于 Glide的功能源码分析,有兴趣可以继续关注
  • 今天,我将主要讲解在使用Glide缓存功能时的问题:为什么Glide 的缓存无起作用,希望你们会喜欢。

请先阅读文章Android源码分析:手把手带你分析 Glide的缓存功能


1. 背景

  • Glide实现内存 & 磁盘缓存是根据 图片的缓存Key进行唯一标识
  • 开发者为了降低成本 & 安全,往往会将图片存放在云服务器上 如 七牛云 等等。
  • 为了保护 客户的图片资源,图片云服务器 会在图片Url地址的基础上再加一个token参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://url.com/image.jpg?token=a6cvva6b02c670b0a
  • Glide加载该图片时,会使用加了token参数的图片Url地址 作为 id参数,从而生成 缓存Key

2. 问题

  • 作为身份认证token参数可能会发生变化,并不是一成不变
  • token参数变了,则图片Url跟着变,则生成缓存key的所需id参数发生变化,即 缓存Key也会跟着变化
  • 这导致同一张图片,但因为token参数变化,而导致缓存Key发生变化,从而使得 Glide的缓存功能失效 缓存Key发生变化,即同一个图片的当前缓存key 和 之前写入缓存的key不相同,这意味着 在读取缓存时 无法根据当前缓存key 找到之前的缓存,从而使得失效

3. 解决方案

3.1 原理

在 生成缓存Key 的id参数 前,将 带有token参数的图片Url地址 去掉 token参数,从而根据 初始的图片Url地址 生成缓存Key的id参数

实现了一个图片的缓存Key的id参数始终唯一 ,即等于 图片Url地址

3.2 储备知识:生成缓存Key的id参数的逻辑

生成缓存Keyid参数的逻辑为:直接将图片的 URL 地址作为缓存Key的id参数

回看文章Android源码分析:手把手带你分析 Glide的缓存功能生成缓存Key的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Engine implements EngineJobListener,
        MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {

    public <T, Z, R> LoadStatus load(Key signature, int width, int height, DataFetcher<T> fetcher,
            DataLoadProvider<T, Z> loadProvider, Transformation<Z> transformation, ResourceTranscoder<Z, R> transcoder,
            Priority priority, boolean isMemoryCacheable, DiskCacheStrategy diskCacheStrategy, ResourceCallback cb) {
        Util.assertMainThread();
        long startTime = LogTime.getLogTime();

        final String id = fetcher.getId();
        // 获得了一个id字符串,即需加载图片的唯一标识
        // 如,若图片的来源是网络,那么该id = 这张图片的url地址
        // fetcher = HttpUrlFetcher的实例,即调用HttpUrlFetcher.getid()->>分析19

        EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),transcoder, loadProvider.getSourceEncoder());
        // 将该id 和 signature、width、height等10个参数一起传入到缓存Key的工厂方法里,最终创建出一个EngineKey对象
        // 创建原理:通过重写equals() 和 hashCode(),保证只有传入EngineKey的所有参数都相同情况下才认为是同一个EngineKey对象
       // 该EngineKey 即Glide中的缓存Key

        ...
}


<-- 分析19:getId() -->
public class HttpUrlFetcher implements DataFetcher<InputStream> {
    ...

    private final GlideUrl glideUrl;
    // GlideUrl = 在上篇文章讲解 图片加载 第2步load()中传入图片url地址时,Glide在内部把图片url地址包装成一个GlideUrl对象

    @Override
    public String getId() {
        return glideUrl.getCacheKey();
        // ->>分析20
}

<-- 分析20:getCacheKey()  -->

public class GlideUrl {

    private final URL url;
    private final String stringUrl;
    ...

    // GlideUrl构造函数
     public GlideUrl(URL url) {
        this(url, Headers.DEFAULT);
    }

    public GlideUrl(String url) {
        this(url, Headers.DEFAULT);
    }


    public String getCacheKey() {
        return stringUrl != null ? stringUrl : url.toString();
        // 在生成GlideUrl对象时:
        // 若传入的是URL字符串(即图片地址),就直接返回该字符串(大多数是这种情况)
        // 若传入的是URL对象,那么就返回这个对象toString()后的结果。

    }

    ...
}

3.3 实现方案

我们只需重写getCacheKey() & 将 带有token参数的图片Url地址 去掉 token参数 即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * 代码实现:创建一个GlideUrl类的子类 & 重写getCacheKey()
  **/
    // 1. 继承GlideUrl 
    public class mGlideUrl extends GlideUrl {

        private String mUrl;

        // 构造函数里 传入 带有token参数的图片Url地址 
        public MyGlideUrl(String url) {
            super(url);
            mUrl = url;
        }

        // 2. 重写getCacheKey()
        @Override
        public String getCacheKey() {
            return mUrl.replace(deleteToken(), "");
            // 通过 deleteToken() 从 带有token参数的图片Url地址中 去掉 token参数
            // 最终返回一个没有token参数、初始的图片URL地址
            // ->>分析1
        }

        // 分析1:deleteToken()
        private String deleteToken() {
            String tokenParam = "";
            int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
            if (tokenKeyIndex != -1) {
                int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
                if (nextAndIndex != -1) {
                    tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
                } else {
                    tokenParam = mUrl.substring(tokenKeyIndex);
                }
            }
            return tokenParam;
        }

    }

/**
  * 使用缓存时:需要在load()中传入自定义的 mGlideUrl对象
  **/

    Glide.with(this)
         .load(new mGlideUrl(url))
         .into(imageView);

    // 注:a. 若像之前直接传入图片的url地址,那么在内部还是会使用原始的GlideUrl类
    //    b. 即直接将传入传入图片的url地址作为缓存key的Id参数,而没有对token参数作任何处理

4. 总结


帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年02月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
R语言安装教程 | 图文介绍超详细
Note! 提醒大家一下,如果大家需要经常使用Bioconductor上的包进行生信分析的话,即使你是M1的用户,也推荐你选择intel版本的R
生信漫卷
2022/10/13
1.1K0
🤯 VS Code | 在VS Code中搭建你的R语言运行环境吧!~(图文介绍超详细)
1什么是VS Code 🧐 Visual Studio Code(简称 VS Code)是一款由微软开发的跨平台编辑器,支持语法高亮,代码自动补全,代码重构等功能。😚 用户可以通过安装扩展程序,来扩展软件的功能。🔍 2019年,Stack Overflow组织了开发者调查,其中Visual Studio Code被认为是最受开发者欢迎的开发环境。🥰 据调查,87317名受访者中有50.7%的受访者声称正在使用Visual Studio Code。🌟 2下载并安装R 这里我们就不做具体介绍了,大家可以翻看之前
生信漫卷
2023/02/24
17.8K2
🤯 VS Code | 在VS Code中搭建你的R语言运行环境吧!~(图文介绍超详细)
R及RStudio下载安装教程(超详细)
R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、绘图、数据挖掘。
全栈程序员站长
2022/07/02
9.1K0
R及RStudio下载安装教程(超详细)
R语言入门
最近在复习python的科学计算,突然心血来潮,想看看R的数据处理和python的区别在哪,所以就有了这篇文章。 R语言简介 四十多年前, R 语言的始祖诞生了 , John Chambers 在贝尔实验室中开发出S语言 ,用于快速地进行数据探索, 统计分析和可视化 。十几年后 , 新西兰奥克兰大学的 Robert Gentleman 和 Ross Ihaka 在 S 语言的基础上发明了 R 语言 。 R 语言流淌着统计学的血液 , 它内置了海量的统计函数 ,使用者可以利用其对数据进行快速交互分析 。
若与
2018/04/25
2.5K0
R语言入门
全宇宙最全的R语言安装教程(windows10)
学习R语言最快的方式就是找代码、打代码。那么我们代码往哪里打呢,安装R软件中其实有很多需要我们注意的地方,比如路径不能有中文名什么的(这里我强烈建议大家的电脑用户名最好也是英文,自己的英文名什么的)等。
生信喵实验柴
2021/12/15
6.6K0
全宇宙最全的R语言安装教程(windows10)
R语言软件安装教程「建议收藏」
安装R和Rstuido软件 R语言是用于统计分析,图形表示和报告的编程语言和软件环境;Rstudio是编辑、运行R语言的最为理想的工具之一。
全栈程序员站长
2022/09/14
5K0
R语言软件安装教程「建议收藏」
从 R 绘图入门看 R 语言学习方法论
因为一些网络素材引用不规范,我们的这个笔记被网络吞掉了一次。很多朋友在公众号后台催更,还好鲍志炜抽空抢救回来了,不负大家的等待。
生信技能树
2022/06/08
9840
从 R 绘图入门看 R 语言学习方法论
R语言-安装使用指南
R语言是用于统计分析,图形表示和报告的编程语言和软件环境。 R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建,目前由R语言开发核心团队开发。
DrugAI
2021/01/28
9980
R 语言的安装(详细教程)「建议收藏」
我不生产知识,我只是知识的搬运工,以下内容是源于 B站 – 徐州更 的安装教程:可能是最好的R语言安装指南哔哩哔哩bilibili
全栈程序员站长
2022/09/14
7.7K0
R 语言的安装(详细教程)「建议收藏」
手把手教你进行R语言的安装及安装过程中相关问题解决方案
这篇文章旨在为R语言的新手铺砖引路,行文相对基础,希望对在R语言安装上有问题的小伙伴提供帮助和指引。
前端皮皮
2020/11/26
1.3K0
手把手教你进行R语言的安装及安装过程中相关问题解决方案
手把手教你进行R语言的安装及安装过程中相关问题解决方案
这篇文章旨在为R语言的新手铺砖引路,行文相对基础,希望对在R语言安装上有问题的小伙伴提供帮助和指引。
Python进阶者
2018/12/20
9710
手把手教你进行R语言的安装及安装过程中相关问题解决方案
独家 | 手把手教你学习R语言(附资源链接)
作者:NSS 翻译:杨金鸿 术语校对:韩海畴 全文校对:林亦霖 本文约3000字,建议阅读7分钟。 本文为带大家了解R语言以及分段式的步骤教程! 人们学习R语言时普遍存在缺乏系统学习方法的问题。学习者不知道从哪开始,如何进行,选择什么学习资源。虽然网络上有许多不错的免费学习资源,然而它们多过了头,反而会让人挑花了眼。 为了构建R语言学习方法,我们在Vidhya和DataCamp中选一组综合资源,帮您从头学习R语言。这套学习方法对于数据科学或R语言的初学者会很有用;如果读者是R语言的老用户,则会由本文了解
数据派THU
2018/01/29
2.8K0
独家 | 手把手教你学习R语言(附资源链接)
R语言从入门到精通:Day1
今天是我们的系统教程《R语言从入门到精通》的第一讲,前面的背景讲解中《从今天开始,每天学点R语言~》,已经深入探讨过R语言的重要性以及学习R语言的必要性,今天我们就按照课表来讲解:如何在自己的PC中安装R语言的运行环境。还没有领取《学习R》书籍教材的同学,赶紧联系文末的客服小姐姐吧~
用户6317549
2019/09/24
2.4K0
R语言从入门到精通:Day1
R语言学习--R for Data Science(一)
刚开始接触R语言是因为单细胞数据分析的需要,那时完全是零基础,学习过程是边抄别人的代码,边理解这些代码的含义,遇到了比较多的坑,包括软件安装,环境配置,R包安装,代码换了参数就报错等。这种纯实战虽然可以快速“上手”,但是没有基础很难提升,而且很难写出自己的代码。
R小白
2022/03/23
2K0
R与RStudio的详细安装教程(有每一步的详细教程!!!!)
(如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ:1732501467)
全栈程序员站长
2022/09/14
3K0
R与RStudio的详细安装教程(有每一步的详细教程!!!!)
R语言系列第一期:R语言背景、下载安装及功能介绍
之前的文章中我们总体上为大家介绍了R软件的强大功能及其便利性,那么我们就利用这个专题为大家分享一下这款科学绘图和计算的计算机程序的使用方法。作为这个系列的开始,我们首先得为大家介绍一下这款软件的基础知识。
微点
2019/05/11
8910
tidyverse:R语言中相当于python中pandas+matplotlib的存在
tidyverse就是Hadley Wickham将自己所写的包整理成了一整套数据处理的方法,包括ggplot2、dplyr、tidyr、readr、purrr、tibble、stringr、forcats。出版有《R for Data Science》(中文版《R数据科学》),这本书详细介绍了tidyverse的使用方法。
拴小林
2021/01/12
5K0
R语言中如何查看安装过的R包
当年学习Perl语言时,看小骆驼,上面有个CPAN的东西,说是上面有很多包,但我的技术仅仅入门,包是一次也没有用上。但是R语言不一样,没有R包寸步难行,虽然用R的base包可以把程序写得像bash一样冗长无味,但我还是习惯用tidyverse系列,习惯了,毕竟R包是另一种语言,tidyverse结构的一致性,让我张口就来,不用查说明文档了……
邓飞
2022/07/27
2.3K0
R语言中如何查看安装过的R包
七步即可学会R语言,从此数据分析不再怕!
本文特约作者为 DataCamp 的联合创始人 Martijn Theuwissen 。更多 R 语言资源请访问这里(http://t.cn/R9Uo2po) ,各种 R 语言源代码也在其中。 这里(http://t.cn/RZ0nGo0)还有一份数据科学备忘清单,能让你从零开始学习数据科学,包括 R 语言。 如果你没有编程经验,或者是对点击式的统计软件更熟悉(而非真正的编程语言), R 语言学起来还是有点难度的。本文的学习方法更适合 R 语言小白,不过老司机们也可以从中获得 R 语言的最新动态。 本文的
AI研习社
2018/03/19
2.8K0
七步即可学会R语言,从此数据分析不再怕!
R语言基础教程——第2章:R下载安装和环境搭建
下载地址为:https://cran.r-project.org 进入链接,如下图所示,在页面顶部提供了三个下载链接,分别对应三种操作系统:Windows、Mac和Linux。请选择自己操作系统对应的链接。
DoubleHelix
2019/08/07
6K0
R语言基础教程——第2章:R下载安装和环境搭建
推荐阅读
相关推荐
R语言安装教程 | 图文介绍超详细
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验