Glide 加载 七牛 动态url 图片并缓存

Glide图片加载库的缓存机制全面解析:从原理到企业级优化实战 本文深入解析了Glide图片加载库的缓存机制,包括其三级缓存架构(活动缓存、内存缓存、磁盘缓存)的工作原理和实现方式。通过分析默认配置的四大致命缺陷(内存僵化、磁盘混存、网络加载无优先级、资源回收滞后),本文提供了企业级优化方案,包括动态内存调整、磁盘分区优化、网络预加载智能降级和资源回收优化等。文章通过电商App和社交应用的实战案例,展示了这些优化方案的实际效果,如首屏加载速度提升40%、内存占用下降45%等。 阅读详情

                 Glide 是谷歌推荐的Android 图片加载框架,他的优点不用多说。随着云服务的兴起,七牛的图片存储也逐渐被大众所接受,然而,部分图片为了存储的安全性,七牛采用了动态 token 生成 图片url 的做法,通常情况下,图片加载框架是以图片的URL 为缓存的唯一标识的,Glide 也不例外。

          七牛的动态URL使得同一张图片每次加载时的地址都不相同,我们也知道,通常情况下,像 picasso    Android-Universal-Image-Loader 等图片的缓存都是基于URL全路径做为缓存的标识与依据的,    Glide 也不例外,那么问题就产生了,如何缓存动态的url 图呢? 我们总不能每次都从服务器加载同一张图片吧,即使那个图片很小,也最好不要每次都浪费这必要的流量。

           问题的根本是缓存时的唯一标识符不能变。根据这一要求,我样可以有两种选择:一 修改Glide 框架源码,让其自动识别七牛 图片地址并做特殊处理。二 采用偷梁换柱的方法,让Glide 每次应对同一张图片的不同地址时都加载最早一次的缓存, 如果在本地磁盘找到缓存根本就不需再访问网络。

           为了一个七牛显然不值得去修改 Glide 源码。为此,我们主要是介绍第二种方法。在缓存地址上下文章。

http://xiangbalao.org/FlopaR58EF90fqHBzPAWeroBTnwK?imageView2/2/w/200/h/2002/w/200/h/200&e=1469352718&token=wQknukoe-lwcjLKEnsBzBrL61M1BEMP0Gq_M2qP:uyLFpK8vQXeM9qegAeT1P2OzSls=

      这是一个典型的 七牛动态 URL ,通过我们分析,我们发现,这个 url 其实是分为三部分的 :1 不动的基地址,2用来来示参数的问号, 3 动态的 token 等参数


http://xiangbalao.org/FlopaR58EF90fqHBzPAWeroBTnwK

?

imageView2/2/w/200/h/2002/w/200/h/200&e=1469352718&token=wQknukoe-lwcjLKEnsBz-
BrL61M1BEMP0Gq_M2qP:uyLFpK8vQXeM9qegAeT1P2OzSls=

 

  只要能找到唯一标识符就好办了,这样我样可以写一个工具类,做一个url缓存,当发现我们第一次加载本图时,从服务器直接加载,这时,Glide 已经将图缓存在了本地。我们用 通过?号前面的地址将这个图片的缓存url存起来,当下次加载本图时,如果发现有本url 的缓存,直接取出来,Glide就可以从本地加载本图了。

    听起来似乎很绕,直接上代码

 
 

package org.xiangbalao.glide;

import android.content.Context;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.orhanobut.hawk.Hawk;

/**
 * Created by longtaoge on 2016/7/25.
 */
public class GlideUtils {
    // public static String slipTag = "\\?";  //加载七牛时用本分隔符
    public static String slipTag = "it";
    public static void loadImage(final Context context, final String url, final ImageView imageView) {

        if (url != null) {
            String[] urls = url.split(slipTag);
            if (urls.length > 1) {
                if (Hawk.get(getCacheUrl(url)) == null) {//用图片URL固定的部分获取第一次缓存图片时的全URL
                    Hawk.put(getCacheUrl(url), url); //如果没有缓存过,将第图片第一次加载时的URL缓存起来
                    //第一次加载用全路径从网络上加载
                    Glide.with(context)
                            .load(url)
                            .into(imageView);

                } else {
                    //第二次以后能过 url 加载本地缓存图片
                    Glide.with(context)
                            .load(String.valueOf(Hawk.get(getCacheUrl(url))))
                            // 设置加载失败监听,假如由于缓存过期或
                            // 者被清等客观原因导致加载失败,从最新的url 加载,并更新本地缓存
                            .listener(new RequestListener<String, GlideDrawable>() {
                                @Override
                                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                                
                                    Glide.with(context)
                                            .load(url)
                                            .into(imageView);
                                    return false;
                                }
                                @Override
                                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                    Hawk.put(getCacheUrl(url), url); //更新缓存
                                   return false;
                                }
                            })
                            .into(imageView);
                }

            } else {
                //如果非动态URL 则直接加载即可
                Glide.with(context)
                        .load(url)
                        .into(imageView);
            }
        }
    }

    public static String getCacheUrl(String url) {
        if (url != null) {
            String[] urls = url.split(slipTag);
            if (urls.length > 0) {
                return urls[0];
            } else {
                return "";
            }
        } else {
            return "";
        }

    }


}

本例地址 GlideDemoActivity.java 







Android 图片加载框架 Glide 详细介绍 内存缓存:用于存储已经加载的图片数据,以避免重复读取内存中的数据。这可以显著提高图片显示的速度,因为内存的访问速度远快于从硬盘或网络加载数据。硬盘缓存:用于存储从网络或其他来源下载的图片数据,以防止重复下载。这不仅可以节省带宽,还能提高应用的响应速度,尤其是在网络条件不佳时。 阅读详情

相关推荐

Glide集成HTTP签名:为Android图片URL加载打造防篡改安全锁

在移动应用开发中,图片加载是基础且高频的技术需求,Android开发者广泛使用Glide库来实现高效、便捷的图片加载与缓存。然而,直接暴露图片URL存在盗链、越权访问等安全风险,这引出了对请求完整性与身份验证的需求。HTTP签名作为一种密码学验证框架,通过对请求关键要素(如URL、时间戳、方法)计算HMAC签名,确保请求在传输过程中未被篡改且来源合法,有效防御重放攻击与参数篡改。其技术价值在于为API或资源访问提供了轻量级、可验证的安全层,尤其适用于保护用户私有图像、付费内容预览等敏感场景。本文以Glide

weixin_30808693的博客 350

Android Glide4缓存动态url图片

Glide是目前最流行开源图片处理框架之一,拥有强大的图片加载,缓存功能。在开发中,使用起来真是爽歪歪。 Glide GitHub地址:https://github.com/bumptech/glide   Glide和Picasso的缓存策略都十分出色,他们都是基于图片的url作为key进行缓存。 先回顾Glide的缓存策略: 内存缓存:skipMemoryCache(boolean)...

c_3822的博客 1332

利用Glide库实现Android动态加载等比例网络图片的技巧

Glide库通过提供一套简单易用的API,使得开发者可以轻松地加载网络、本地存储或资源文件中的图片到应用的ImageView组件中。其主要优势包括:高效的图片缓存机制:Glide利用磁盘和内存缓存减少了图片加载时间,同时降低了内存和存储空间的消耗。流畅的图片加载体验:自动处理图片加载过程中的各种状态,如加载中、加载失败或图片占位符的显示。支持多尺寸图片加载:Glide可以自动处理不同尺寸的图片加载问题,确保图片按需加载,避免不必要的内存浪费。

weixin_32102617的博客 1138

android gif glide,使用Glide从URL加载占位符以在加载GIF时显示(Android)

美好的一天.我有的是这个:Glide.with(this).load(imageUrl).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(R.drawable.gif).into(imageView);但相反,我想使用Glide加载相同的gif asBitmap()作为占位符,同时加载实际的gif.就像我能做的那样:....

weixin_32820311的博客 393

Glide动态加载图片

Glide动态加载图片(transform方法不识别问题) 包括内容如下 (1)Glide加载图片(圆角、圆形等)采用Glide3.6.1 (2)Github上资源关于解决4.0以上Glide的参考Demo 可以参考个人博客“关于Android加载图片的问题”,有详细讲解

BMW Trojan 样本分析

仅用于链接已经删却但是需要方便查阅的原文http://blog.youkuaiyun.com/zirconsdu/article/details/7997470 转载请注明出处http://blog.youkuaiyun.com/zirconsdu/article/details/8153813。 一些具体数据结构和具体路径隐去。   BMW木马样本分析 摘要 2011年底和某Hunter的谈话涉及到当时新检

zirconsdu的专栏 3911

Glide使用总结

10、当引用的 url 存在 token 时解决方法–>重写 Glide 的 GlideUrl 方法super(url);mUrl = url;@Override= -1) {= -1) {} else {然后加载图片的方式为:11、利用Glide将图片加载到不同控件或加载成不同使用方式(1)、拿到图片实例//1、通过自己构造 target 可以获取到图片实例@Override//2、将图片实例记载到指定的imageview上,也可以做其他的事情。

2401_84123232的博客 1210

vietjetair 航空的webpack多参数生成学习

工作内不是特别多,居安思危,有一个抓机票信息的公司面试前竟然需要做面试题,这就是一个题。看了下,有点麻烦,webpack 最初不得要领,看了下资料,找了个框架,练了两个简单的,搞这个吧。入库需要自己找,有几个参数不是明文的,算法不是很复杂,位置不太好找。整体难度一般。

liu_yueyang的博客 1510

解决glide加载七牛云图片缓存问题(url带token)

七牛云带验证URL http://xxx.com/FmmoICAJpy2Q1iNGUw7R2K94uH5x?token=dTVWOtVUIiuiyke-tBBl8pl1w6sdK3iO_kE4p9yQ:7SM9kXzG6DvsuehiiJMxHy41SUQ 七牛云带验证并且带过期时间的URL http://xxx.com/FmmoICAJpy2Q1iNGUw7R2K94uH5x?e=

wangdaqi77的博客 2473

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1739

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1199

Android 使用Glide加载图片,当url不变时加载图片,缓存的问题

1.需求 当用户上传图片时,我需要把url上传到,阿里云OSS和后台服务器. 2.现象 因为每个用户的头像只有一个,上传到阿里云OSS服务器的图片和上传后台服务器的图片,只能是覆盖的,所以,前后图片的url是一样的 前台使用Glide加载图片,Glide缓存机制是,如果前后url是一样的,只从缓存中加载图片,不再加载网络图片 3.解决 解决的方式分为俩种 (1)每次加载图片的时候设置...

as89751的博客 1610

韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。本文重点介绍了服务端的启动链路、网络初始化和连接处理这三个过程,并简要分析的游戏循环的实现与数据包处理,在下一篇文章中,我们会从客户端角度分析从游戏启动、登录、游戏开始和基础游戏交互的全流程。

东方猫的博客 2497

3步解决Glide动态URL缓存难题:让图片加载永远最新

Glide作为Android平台上专注于平滑滚动的图片加载和缓存库,在处理动态URL时常常遇到缓存问题。本文将通过三个简单步骤,帮助开发者彻底解决Glide动态URL缓存难题,确保图片加载永远保持最新状态。 ## 为什么动态URL缓存会成为难题? 动态URL通常包含随机参数或时间戳,这使得Glide默认的缓存机制难以识别相同资源的不同URL。例如,同一图片可能因为URL参数变化而被Glide视

gitblog_01109的博客 339

高性能优化的本质

在很早之前,处理器性能的提升一般是通过减小元器件的尺寸,增加元器件的数量,提高主频来实现,这也是摩尔定律所说的,但是由于功耗的影响,主频不能一直增加。后来,由于英伟达的GPU的并行计算的出现,逐渐打破摩尔定律,人们利用多核,SIMD,SIMT来处理大量相同计算的数据,这极大的提高了效率。计算机的算力得到了巨大的提升,但是并行是困难的,对于有数据依赖的程序来说,处理并行是一件及其困难的事,但对于一些简单的数学库的计算,并行的实现相对简单。

发狂的小花的博客 273

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

android glide不缓存,Glide中的缓存

本文主要介绍了如何配置和管理Glide中的缓存,其中大部分内容都可以直接在官方Wiki中找到,这里只是进行了整理和汇总。言归正传,Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。磁盘缓存一般的图片缓存指的就是磁盘缓存,把网络上的图片缓存到本地,这样就不需要每次都从网络加载,既提高了加载速度,又为用户节省了流量。Glide在默认情况下是开启磁盘缓存的...

weixin_36332394的博客 1851

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集的建立

运动物体的微多普勒效应为人体动作识别提供了可能,基于雷达的居家检测具有良好的隐私保护性,且不易受环境因素影响(如光照、温度等),近年来已受到国内外学者的广泛关注。基于雷达与深度学习的摔倒检测使用自建的雷达数据集进行人体摔倒检测的研究。雷达数据集的建立分为雷达数据采集和雷达数据处理两部分工作。

洋洋Young的博客 3403

Glide图片加载方案

Glide

安妍妍的博客 1772

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

图片加载框架Glide简单使用和缓存原理

基本使用流程 Glide最基本的使用流程就是下面这行代码,其它所有扩展的额外功能都是以其建造者链式调用的基础上增加的。 GlideApp.with(context).load(url).into(iv); 其中的GlideApp是注解处理器自动生成的,要使用GlideApp,必须先配置应用的AppGlideModule模块,里面可以为空配置,也可以根据实际情况添加指定配置。 @GlideModu...

欢迎交流 1005

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

终极指南:Glide如何完美处理动态URL和签名URL加载问题

在Android开发中,**Glide**作为一款强大的图片加载库,在处理**动态URL**和**签名URL**时展现出独特的优势。如果你在使用Glide加载图片时遇到了签名URL失效的问题,这篇文章将为你提供完整的解决方案。🚀 ## 为什么动态URL和签名URL会带来问题? **签名URL**通常用于安全访问云端图片资源,但它们的时效性往往有限。当URL发生变化时,Glide的缓存机制可能

gitblog_00953的博客 352

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

解决因为图片URL变化导致Glide缓存功能失效

问题的提出: 我们知道,Glide的缓存是由十多个和复杂的参数来决定的,其中最关键的就是id,(当你用Glide加载网络上的图片时,这个id就是图片的url),但是我们可能会碰到这么一种情况,就是你后端返回的图片时带token的,接下来问题就来了,token作为一个验证身份的参数并不是一成不变的,很有可能时时刻刻都在变化。而如果token变了,那么图片的url也就跟着变了,图片url变了,缓...

chen8124的博客 1262

Glide图片缓存问题,同一url换图片不起作用问题

Glide的引入网上很多,更换图片时候调用资源id时候多更改名字才可以实现,网络请求时候用一个固定url请求也不加载直接读取缓存,导致后台换图片,手机不起作用。 网上说完全起线程清除缓存,或者 设置跳过内存缓存 Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView); 但是都不起作用,

spt_dream的博客 1万+

彻底解决图片链接过期问题:Glide动态URL签名方案终极指南

在Android应用开发中,图片加载是一个永恒的话题。当我们使用Glide这个强大的图片加载库时,经常会遇到一个棘手的问题:**动态URL链接过期**。这种情况在电商应用、社交平台和新闻客户端中尤为常见,用户看到的往往是加载失败的占位图或空白区域,严重影响了用户体验。😫 Glide作为Android平台上最流行的图片加载和缓存库,提供了完整的解决方案来处理这个问题。通过URL签名机制,我们能够

gitblog_01030的博客 361

Glide 缓存策略 内存缓存和磁盘缓存

本文主要介绍了如何配置和管理Glide中的缓存,其中大部分内容都可以直接在官方Wiki中找到,这里只是进行了整理和汇总。言归正传,Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。 磁盘缓存 一般的图片缓存指的就是磁盘缓存,把网络上的图片缓存到本地,这样就不需要每次都从网络加载,既提高了加载速度,又为用户节省了流量。 Glide在默认情

myf0908的博客 2607

Glide加载图片URL不变则图片还是以前的旧图片

因为Glide加载图片会将图片缓存到本地,如果url不变则直接读取缓存不会再网络加载 解决方法:      1.每次加载都清除缓存(最差的方法),相当于舍弃了缓存这个重要的功能。      2.让后台每次都更改图片名字。      3.图片地址用   url+"?key="+随机数    这种格式 Glide.with(context).load(dataList.get(positi...

pxcz110112的博客 2603
上一篇: Android 开发神器系列(工具篇)之 Android WiFi ADB
下一篇: Android 开发神器系列(工具篇)之 Android 屏幕共享工具
longtaoger
博客等级 码龄13年 7粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值