Glide默认使用内存和磁盘缓存来避免不必要的网络请求。可以发现你并不需要额外自己激活缓存。Glide本身自带缓存。然而,如果你的图片变化的非常快,你需要避免一些缓存。
内存缓存
我们通过一个非常简单的请求:从网络加载一个图片到ImageView:
1 | Glide |
我们调用了.skipMemoryCache( true )去特意告诉Glide跳过内存缓存。这意味着Glide不会把这个图片缓存到内存里。这只影响内存缓存,Glide为了避免以后的网络请求,仍然会缓存到磁盘。
由于Glide默认会将所有的图片资源缓存到内存中,因此,没有必要手动调用.skipMemoryCache( false )了。
提示:注意到现实情况,如果你要对同一个URL做一个初始化的请求,第一次没使用.skipMemoryCache( true ),然后第二次使用了,将会获取缓存在内存中的资源。当你调整缓存行为的时候,确保请求的都指向同一个资源。
跳过磁盘缓存
即使你关闭了内存缓存,所请求的图片仍然会被保存在设备的磁盘存储上。如果你有一张不断变化的图片,但是都是用的同一个URL,你可能需要禁止磁盘缓存了。
可以用.diskCacheStrategy()方法改变Glide的行为。不同于.skipMemoryCache()方法,它将需要从枚举型变量中选择一个,而不是一个简单的boolean。如果你想要禁止请求的磁盘缓存,使用枚举型变量DiskCacheStrategy.NONE作为参数。
1 | Glide |
上面代码里的图片根本不会被保存在磁盘上。默认情况下它仍然使用内存缓存,为了同时禁止掉两个缓存,结合一下方法:
1 | Glide |
自定义磁盘缓存行为
Glide的磁盘缓存是相当复杂的。Picasso只缓存全尺寸图片;Glide会缓存原始、全尺寸的图片和额外的小版本图片。如果你请求一个1000x1000像素的图片,你的ImageView是500x500像素,Glide会保存两个版本的图片到缓存里。
.diskCacheStrategy()中枚举参数的意义:
- DiskCacheStrategy.NONE 什么都不缓存
- DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。上面例子里的1000x1000像素的图片
- DiskCacheStrategy.RESULT 只缓存最终降低分辨后用到的图片
- DiskCacheStrategy.ALL 缓存所有类型的图片 (默认行为)
如果有一个图片需要经常处理,会生成各种不同版本的图片,缓存它的原始的分辨率图片才有意义。这样,我们使用DiskCacheStrategy.SOURCE去告诉Glide只缓存原始版本:
1 | Glide |
单张图片的无效缓存
由于Glide会缓存一张图片的多个版本的分辨率图片,所以并不好轻易从缓存中删除一个文件,你需要去找到所有这个图片可能有关系的缓存。这是一个相当复杂的处理,可以参考官方wiki在无效缓存上的指导。
参考资料:
签到钱就到 Glide入门教程——7. 缓存基础