Android Glide数据更新及内存缓存、硬盘缓存清理

Android的Glide在加载图片时候内部默认使用了缓存机制,Glide的缓存机制分为两级,第一级是内存缓存,然后第二级是硬盘缓存。缓存的过程首先是在内存中缓存,然后将加载的图片资源缓存到硬盘,这样就可以在随后的再次加载中使用缓存了,Glide使用缓存时候首先要检查内存这一层级是否缓存了相应的缓存,如果有,则直接使用,如果没有,则深入到硬盘缓存中检查是否有,如果有,则加载之,如果到这一步骤还没有,那么就只能作为一个全新的资源加载了。
从这个过程中,Glide使用缓存无疑大大提高了上层代码的性能,但是,有些情况下,这种缓存策略则可能并不适用。比如,APP中有一个头像,该头像是从一个固定链接http://xxx.xxx.jpg读取,假设代码第一次读取后,缓存到了本地。然而,几分钟后该图片更新了,但是链接仍然是http://xxx.xxx.jpg。随后,假设,三小时或三天或三十天后同样的链接http://xxx.xxx.jpg读取,此时Glide加载时候检查缓存,发现针对http://xxx.xxx.jpg的资源已经缓存,那么Glide不再从服务器读取,而是直接加载本地缓存使用,这样就造成了Glide加载出来的图片资源不是最新的。
总结: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)                .into(image);

关键代码:skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
skipMemoryCache(true) ,跳过内存缓存。
diskCacheStrategy(DiskCacheStrategy.NONE) ,不要在disk硬盘中缓存。

这两个函数同时联合使用,使得Glide针对这一次的资源加载放弃内存缓存和硬盘缓存,相当于一次全新的请求。这样就迫使Glide从给定的资源地址发起全新的数据加载,而非从旧有的缓存中取缓存使用。

附录:
1,《Android图片加载与缓存开源框架:Android Glide》链接:http://blog.csdn.net/zhangphil/article/details/45535693
2,《Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果》链接:http://blog.csdn.net/zhangphil/article/details/52806374

更多相关文章

  1. Android(安卓)Paging分页库的学习(二)—— 结合Room数据库进行分页
  2. android上面遇到的一些内存泄露问题
  3. Android中用html代码来实现界面 WebView控件
  4. Android开发--身高体重指数(BIM)计算--访问标识符号(android:id属性/
  5. android MultiDex multidex原理原理下遇见的N个深坑(二)
  6. 如何Android数据库缓存进行管理
  7. Android大图加载优化--基于LRU算法的本地文件缓存
  8. Android中资源文件(非代码部分)的使用概览
  9. android资源自适应的认识(一)

随机推荐

  1. Android(安卓)TextView文字太多显示的最
  2. 当我们讨论流畅度的时候,我们究竟在说什么
  3. iPhone 6 16G不够用?给iPhone 6扩容的技
  4. 05Android学习从零单排之Androidmultimed
  5. Android完整知识体系路线(菜鸟-资深-大牛
  6. App模块化及工程扩展
  7. [Android基础] VideoView
  8. Android(安卓)Studio使用USB真机调试
  9. Andoird用户界面设计上手指南:设置字体大
  10. android 文件存储调试细节(小米系统)