当前位置:网站首页>解决Glide图片缓存问题,同一url换图片不起作用问题
解决Glide图片缓存问题,同一url换图片不起作用问题
2022-08-11 05:22:00 【骑猪追大象】
解决方法有两个:
1.每次加载都清理缓存。
但这个方法是不可取的, 会导致每次都去网络加载图片. 显示非常慢. 这就相当于废弃了缓存这个好用的功能:
Glide.with(this)
.load(uri)
.asBitmap()
.centerCrop()
.diskCacheStrategy( DiskCacheStrategy.NONE )//禁用磁盘缓存
.skipMemoryCache( true )//跳过内存缓存
.placeholder(R.mipmap.ic_head_default)
.transform(new GlideCircleTransform(this)).into(headIV);
第二种方法:
.signature(new StringSignature(UUID.randomUUID().toString()))//增加签名
这个api是增加签名,地址不变,改变这个签名参数也会不读取缓存重新请求。
Glide中的图片缓存key的生成是通过一个散列算法来实现的,所以很难手动去删除指定的图片缓存
Glide的图片缓存都有对应的唯一标识符,如果是相同的,就不加载调用缓存
不过改变标识符很困难,所以Glide提供signature()方法,来附加一个数据到缓存key中
如果链接是文件,就用StringSignature,
比如:
.signature(new StringSignature(yourVersionMetadata));
如果链接是多媒体,就用MediaStoreSignature,
比如:
.signature(new MediaStoreSignature(mimeType, dateModified, orientation))
Glide 4.0 解决图片缓存两次加载图片相同 StringSignature 找不到类
旧版本Glide中.signature()方法形参支持使用StringSignature。但在Glide 4.0里面这个方法不仅被移到RequestOptions中,而且形参改为Key。
解决办法
Key
Key是一个接口,需要实现抽象方法
void updateDiskCacheKey(MessageDigest messageDigest);
ObjectKey
Key还有一个使用相对方便的子类ObjectKey,构造方法以Object为参数,下面是实际用法:
public static RequestOptions userAvatarOptions = new RequestOptions()
.placeholder(R.drawable.def_avatar)
.error(R.drawable.def_avatar)
.signature(new ObjectKey(System.currentTimeMillis()))
.encodeQuality(70);
代码中创建了一个ObjectKey实例,并把当前时间戳整形值作为参数。
源码
顺便贴出Key和ObjectKey的源码,请自行查阅:
public interface Key {
String STRING_CHARSET_NAME = "UTF-8";
Charset CHARSET = Charset.forName(STRING_CHARSET_NAME);
void updateDiskCacheKey(MessageDigest messageDigest);
@Override
boolean equals(Object o);
@Override
int hashCode();
}
public final class ObjectKey implements Key {
private final Object object;
public ObjectKey(Object object) {
this.object = Preconditions.checkNotNull(object);
}
@Override
public String toString() {
return "ObjectKey{"
+ "object=" + object
+ '}';
}
@Override
public boolean equals(Object o) {
if (o instanceof ObjectKey) {
ObjectKey other = (ObjectKey) o;
return object.equals(other.object);
}
return false;
}
@Override
public int hashCode() {
return object.hashCode();
}
// Charset CHARSET = Charset.forName("UTF-8");
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
messageDigest.update(object.toString().getBytes(CHARSET));
}
}
最终解决方案
RequestOptions userAvatarOptions = new RequestOptions()
// .placeholder(R.drawable.def_avatar)
// .error(R.drawable.def_avatar)
.signature(new ObjectKey(System.currentTimeMillis()));
Glide.with(ProfileActivity.this).applyDefaultRequestOptions(userAvatarOptions).load(iamgePath).apply(RequestOptions.bitmapTransform(new CircleCrop())).
into(mIvApHeader);
参考:
边栏推荐
猜你喜欢

npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

centos—docker安装mysql

静态综合复习实验

error: The following untracked working tree files would be overwritten by merge: .hbuilderx/launch

若依分离版—增加通知公告预览功能

正则表达式与绕过案例
![《现代密码学》学习笔记——第三章 分组密码 [二] AES](/img/83/161111c5f085f2f3d6587e32e15805.png)
《现代密码学》学习笔记——第三章 分组密码 [二] AES

海内外媒体宣发,关键词优化

《现代密码学》学习笔记——第四章 公钥密码

若依分离版—移动端开发通知公告功能
随机推荐
配置@路径简化路径处理
>>开发工具:开发工具排名对比
代币标准--ERC721协议源码解析
关于修改挂载到宿主机上的mysql配置文件不生效这件事
慢查询语句的优化思路
mysql基本概念之索引
How to open archives in administrator mode
07-nodemon安装和使用
Nodered系列—写入tDengine超级表,自动创建子表
正则(三剑客和文本处理工具)
>>开发工具:IDEA格式化代码无效
Mobx--store状态管理工具
>>数据管理:DAMA简介
GBase 8s分片技术介绍
docker搭建redis主从和哨兵模式集群
BoredApeYachtClub 无聊猿-NFT 源码解析第二节
动态表单配置select
NodeRed系列—nodered安装及基本操作
DNS外带注入SQLMAP
《现代密码学》学习笔记——第七章 密钥管理[二]数字证书