Glide缓存导致图片不更新

      Glide是一个非常好用的图片加载框架,它可以很好的缓存图片以提高图片加载效率。

      但是在使用的时候,会出现一个问题:当服务器图片资源已经更新,但是URL地址不变时,Glide不会重新加载URL,而是从缓存中读取旧的图片资源。

      下面给出两种解决方式:

       1、仅使当前网络加载为服务器新数据——治标,一次性:

        此方法关键在于指定RequestOptions的diskCacheStrategy(DiskCacheStrategy.NONE),并指定skipMemoryCache(true),必须同时指定,否则无效。

        缺点:这样操作等于舍弃了Glide的图片缓存功能,每次都需要重新加载,虽然可以保证加载最新图片,但是当图片不经常改变时,这种做法就有点得不偿失了。

 //更新头像
    public void updateAvatar(){
        RequestOptions options = new RequestOptions()
                .placeholder(R.drawable.ic_ex_logo)
                .error(R.drawable.ic_ex_logo)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true);

        Glide.with(aty).load(avatarUrl).apply(options).into(avatar);

       2、使目标图片显示的所有地方均更新为服务器新数据——治本,永久性

       在加载图片的时候调用下方给出的updateOptions()方法(PS:这个方法可以放在工具类中使用),给RequestOptions指定signature属性,当modified改变时,Glide会判断为新图片,并且重新缓存,这样加载的就是服务器最新图片了。

 /**
     * RequestOptions 一般指定以下属性即可
     *  placeholder : 图片加载时的站位图,可使用loading动画或默认图片
     *  error : 图片加载失败时的显示图片
     *  diskCacheStrategy : 图片缓存路径
     */

RequestOptions options = new RequestOptions()
                .placeholder(R.drawable.bg_round_graylight10)
                .error(R.drawable.def_avatar)
                .diskCacheStrategy(DiskCacheStrategy.DATA);
 /**
     * 刷新RequestOptions,解決Glide图片缓存导致不刷新问题
     * 
     * @param options  
     * @param url       图片地址
     * @param modified  图片修改时间
     */
    public static void updateOptions(RequestOptions options, String url, long modified){
        if(!Util.isEmpty(url) && url.contains(".")){
            try{
                String tail = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
                String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(tail);
                options.signature(new MediaStoreSignature(type, modified, 0));
            }catch (Exception e){}
        }
    }

总结:modified改变时,Glide会将当前URL判断为新资源并且重新缓存,并不会覆盖之前的缓存记录。也就是说如果APP中有多处地方需要显示这个图片,那么就需要在所有显示这个图片的位置给RequestOptions指定signature属性。

 

感谢网友的分享:

https://www.cnblogs.com/whoislcj/p/5565012.html

 

 

 

 

 

你可能感兴趣的:(Android)