Glide的缓存机制虽然提升了性能,但是如果针对固定资源路径的请求,将导致请求得到的资源是缓存的,这样就不能保证最新。换句话说,如果给定资源地址下的资源的频繁更新的,而资源地址是固定,则Glide此时的缓存策略就显得不太合适。
导致这种问题的原因有二:
一, Glide本身使用了缓存。
二, Glide在缓存资源使用<K,V>键值对模型,如果每次都使用http://xxx.xxx.jpg这个URL,那么键相同,意味着Glide匹配键时候,永远可以从缓存中返回键对应的值。
针对这个问题的解决方案:
解决方案1:
从Glide提供的缓存键值对<K,V>结构模型入手,重写缓存的<K,V>键值策略,就可以避免相同资源地址下资源更新问题了,但是这种方案实现比较复杂,也无十分必要。不推荐,除非必需。
解决方案2:
Glide.get(this).clearMemory();
清理内存中的缓存。
Glide.get(this).clearDiskCache();
清理硬盘中的缓存。
以上两个方法清除全局的内存缓存和硬盘缓存,虽然可以一劳永逸的解决缓存导致的资源陈旧问题,但是将严重影响全局性能,所以慎用,除非是在APP整体要做全新的开始或者恢复原始状态,否则尽量避免使用。
解决方案3:
ImageView image= (ImageView) findViewById(R.id.image);
Glide.with(this).load("http://avatar.csdn.net/9/7/A/1_zhangphil.jpg")
.skipMemoryCache(true) //跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) //不缓冲disk硬盘中
.into(image);
关键代码:skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
skipMemoryCache(true) ,跳过内存缓存。
diskCacheStrategy(DiskCacheStrategy.NONE) ,不要在disk硬盘中缓存。
这两个函数同时联合使用,使得Glide针对这一次的资源加载放弃内存缓存和硬盘缓存,相当于一次全新的请求。这样就迫使Glide从给定的资源地址发起全新的数据加载,而非从旧有的缓存中取缓存使用。
参考:
Android Glide数据更新及内存缓存、硬盘缓存清理
Android图片加载与缓存开源框架:Android Glide》