Glide 加载图片,同一url更换图片不更新的问题

474 阅读2分钟

一、解决方法有两个:

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

2、第二种方法:

.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。

1、方法一:

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)); 
    } 
  }

2、最终解决方案

RequestOptions userAvatarOptions = new RequestOptions()
.signature(new ObjectKey(System.currentTimeMillis())); 

Glide.with(ProfileActivity.this)
.applyDefaultRequestOptions(userAvatarOptions)
.load(iamgePath)
.apply(RequestOptions
.bitmapTransform(new CircleCrop()))
.into(mIvApHeader);

参考:blog.csdn.net/luzhenyuxfc…