Glide是目前最流行开源图片处理框架之一,拥有强大的图片加载,缓存功能。在开发中,使用起来真是爽歪歪。
Glide GitHub地址:https://github.com/bumptech/glide
Glide和Picasso的缓存策略都十分出色,他们都是基于图片的url作为key进行缓存。
先回顾Glide的缓存策略:
内存缓存:skipMemoryCache(boolean)方法设置是否跳过使用内存缓存
RequestOptions options = new RequestOptions()
// 默认为false, 即默认使用内存缓存
// 设置true将不使用内存缓存
.skipMemoryCache(true);
磁盘缓存:diskCacheStrategy(DiskCacheStrategy.TYPE)方法设置磁盘缓存类型
DiskCacheStrategy.AUTOMATIC | (默认)根据原始图片数据和资源编码策略来自动选择磁盘缓存策略。 |
DiskCacheStrategy.NONE | 不使用磁盘缓存。 |
DiskCacheStrategy.DATE | 只缓存原始图片数据。 |
DiskCacheStrategy.RESOURCE | 只缓存解码后的图片数据。 |
DiskCacheStrategy.ALL | 原始图片数据和解码后的图片数据都缓存。 |
入正题,缓存动态的url。
在日常开发当中,一些敏感的图片数据url并不会完全只有图片链接信息,通常都会包含用户token参数,时间戳参数等等。
格式例子:http://xxxxx.jpg?token=yyy&other=zzz
这种url是每次都不一样的,它必须包含参数才能进行正常访问。如果url是动态变化的,默认缓存key是url,那么默认的缓存策略将不能正确抵从缓存中读出图片。
解决方案:自定义GlideUrl子类,重写getCacheKey()方法
import com.bumptech.glide.load.model.GlideUrl;
import java.net.URL;
public class LoadImageUrl extends GlideUrl {
private String imageUrl;
public LoadImageUrl(URL url) {
super(url);
this.imageUrl = url.toString();
}
/**
* 截取关键图片url
* @return key
*/
public String getImageId() {
if (imageUrl.contains("?")) {
String[] urls = imageUrl.split("\\?");
return urls[0];
} else {
return imageUrl;
}
}
@Override
public String getCacheKey() {
return getImageId();
}
}
使用:
Glide.with(context)
.load(new LoadImageUrl(new URL(图片完整访问链接)))
.apply(options) // 配置信息
.into(图片容器);