图片加载器 glide 之缓存处理-图片链接带token

518 阅读1分钟

为解决glide版本默认的缓存机制,在图片中带token信息时,每次都会再重新加载,浪费流量,提供一种解决方案,使图片加载时不再每次请求新链接

1.依赖版本为4.9,配置如下

implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'

2.调用方法

1)使用缓存配置

    private static RequestOptions requestOptions = new RequestOptions()
        .onlyRetrieveFromCache(true)//是否只用缓存
        .skipMemoryCache(true)//是否跳过缓存
        .diskCacheStrategy(DiskCacheStrategy.ALL);

2)定义GlideUrl类,用于自定义缓存的key ,将原始链接替换为去除token之后的链接,这样在图片token更新的时候,缓存还可以取到

public static class TokenGlideUrl extends GlideUrl {
    private String mUrl;

    public TokenGlideUrl(String url) {
        super(url);
        mUrl = url;
    }

    @Override
    public String getCacheKey() {
        return getUrlWithoutToken(mUrl);
    }

    /**
     * 截取url之外的验证信息
     * <p>
     * http://172.20.5.155/group1/M00/4B/B4/rBQFm105Y_OAFHLcAADW2awNcbs863.png?ts=1568709232&token=3f73e9ae2754113b48ce779dbf4ad37d
     * <p>
     * http://172.20.5.155/group1/M00/4B/B4/rBQFm105Y_OAFHLcAADW2awNcbs863.png
     *
     * @return
     */
    private String getUrlWithoutToken(String url) {
        String tokenUrl = url;
        if (TextUtils.isEmpty(tokenUrl)) {
            return tokenUrl;
        }

        String[] split = url.split("\\?");
        if (split.length > 1) {
            tokenUrl = split[0];
        }
        return tokenUrl;
    }


}

3)调用

来个简单的方法来调用

 /**
 * 加载图片
 *
 * @param context
 * @param url
 * @param im
 */
public static void loadImg(Context context, String url, ImageView im) {
    Glide.with(context)
            .applyDefaultRequestOptions(requestOptions)
            .load(new TokenGlideUrl(url))
            .into(im);


}

当然别忘记配置混淆了

# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
 **[] $VALUES;
 public *;
}