赞
踩
部门项目的图片资源都是存放在阿里云上面的,最近项目重构,领导决定将内部图片和资料存放在360云上,因此部分支持换成了360云。而360云为了对图片资源进行保护,会在图片的URL地址的基础之上再加上一个令牌参数也就是说,一张图片的URL地址可能会是如下格式:
http://url.com/image.jpg?token=d9caa6e02c990b0a
而使用滑翔加载这张图片的话,也就会使用这个URL地址来组成缓存的关键。
但是接下来问题就来了,令牌作为一个验证身份的参数并不是一成不变的,很有可能时时刻刻都在变化。而如果令牌变了,那么图片的URL也就跟着变了,图片的URL变了,缓存关键也就跟着变了。结果就造成了,明明是同一张图片,就因为令牌不断在改变,导致滑翔的缓存功能完全失效了,这是一个很棘手的问题。项目组的图片加载框架是下滑,但是吉尔德不能直接解决这个问题。为此,我上网找了一些解决方法,再次记录。
一个图片的URL都是唯一的,假设我们可以将令牌后缀过滤,那么就可以正常使用滑翔自带的缓存,解决这个问题。
滑行中是通过GlideUrl这个对象来作为缓存识别的。所以,大佬们的教程也是先查看对应源码。
- public class GlideUrl {
-
- private final URL url;
- private final String stringUrl;
- ...
- public GlideUrl(URL url) {
- this(url, Headers.DEFAULT);
- }
-
- public GlideUrl(String url) {
- this(url, Headers.DEFAULT);
- }
-
- public GlideUrl(URL url, Headers headers) {
- ...
- this.url = url;
- stringUrl = null;
- }
-
- public GlideUrl(String url, Headers headers) {
- ...
- this.stringUrl = url;
- this.url = null;
- }
-
- public String getCacheKey() {
- return stringUrl != null ? stringUrl : url.toString();
- }
- ...
- }
GlideUrl类的构造函数接收两种类型的参数,一种是URL字符串,一种是URL对象。然后getCacheKey()方法中的判断逻辑非常简单,如果传入的是URL字符串,那么就直接返回这个字符串本身,如果传入的是URL对象,那么就返回这个对象的toString()后的结果。
- public String getCacheKey() {
- return stringUrl != null ? stringUrl : url.toString();
- }
因此,我们可以重写getCacheKey()这个方法,来过滤调图片URL里面的令牌后缀。
创建一个MyGlideUrl继承自GlideUrl,代码如下所示:
- public class MyGlideUrl extends GlideUrl {
-
- private String mUrl;
-
- public MyGlideUrl(String url) {
- super(url);
- mUrl = url;
- }
-
- @Override
- public String getCacheKey() {
- return mUrl.replace(findTokenParam(), "");
- }
-
- private String findTokenParam() {
- 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;
- }
- }
可以看到,这里我重写了getCacheKey()方法,在里面加入了一段逻辑用于将图片URL地址中的令牌参数的这一部分移除掉。这样getCacheKey()方法得到的就是一个没有令牌参数的URL地址,从而不管令牌怎么变化,最终滑翔的缓存键都是固定不变的了。
当然,定义好了MyGlideUrl还得使用它才行,将加载图片的代码改成如下方式即可:
- Glide.with(this)
- .load(new MyGlideUrl(url))
- .into(imageView);
我们需要在负载()方法中传入这个自定义的MyGlideUrl对象,而不能再像之前那样直接传入URL字符串了。不然的话滑翔在内部还是会使用原始的GlideUrl类,而不是我们自定义的MyGlideUrl类。这样我们就将这个棘手的缓存问题给解决掉了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。