博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决Glide图片缓存问题,同一url换图片不起作用问题
阅读量:4284 次
发布时间:2019-05-27

本文共 2864 字,大约阅读时间需要 9 分钟。

解决方法有两个:

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(nre 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);

 

-------------------

较常见的应用场景是用户头像的更换,通常后台给的url是固定的

这里也提供其它思路:

1. 封装下代码,对比文件大小,有改变就重新请求

2. 让后台给图片加一个 lastUpdateTime 参数,跟本地缓存的时间不一致就重新请求

转载地址:http://bfcgi.baihongyu.com/

你可能感兴趣的文章
关于设备下挂pc与设备之间使用ipv6地址互ping的问题
查看>>
linux下查看所有用户及所有用户组
查看>>
Linux中的setuid简介
查看>>
IPv6系列-彻底弄明白有状态与无状态配置IPv6地址
查看>>
大学四年,因为看了这些书,我大二就拿了华为Offer
查看>>
ipv6详解阅读笔记
查看>>
struct passwd
查看>>
sockaddr和sockaddr_in详解
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
ioctl()函数获取本机IP、MAC
查看>>
ioctl函数详细说明(网络)
查看>>
太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
查看>>
公司来了一位阿里P7大佬,只做了6个步骤,代码性能瞬间翻倍
查看>>
还觉得linux命令难吗,看这篇2w多字的linux命令详解,通俗易懂
查看>>
Linux面试题(2020最新版)
查看>>
sockaddr和sockaddr_in详解
查看>>
sockaddr和sockaddr_in的区别
查看>>
tar压缩解压缩命令详解
查看>>
DHCP回应报文广播还是单播方式深度探究
查看>>
多网卡情况下,ipconfig针对单网卡操作
查看>>