Glide入门教程(5)Glide缓存基础

       Glide默认使用内存和磁盘缓存来避免不必要的网络请求。可以发现你并不需要额外自己激活缓存。Glide本身自带缓存。然而,如果你的图片变化的非常快,你需要避免一些缓存。

内存缓存

       我们通过一个非常简单的请求:从网络加载一个图片到ImageView:

1
2
3
4
5
Glide  
.with( context )
.load( eatFoodyImages[0] )
.skipMemoryCache( true )
.into( imageViewInternet );

       我们调用了.skipMemoryCache( true )去特意告诉Glide跳过内存缓存。这意味着Glide不会把这个图片缓存到内存里。这只影响内存缓存,Glide为了避免以后的网络请求,仍然会缓存到磁盘。

       由于Glide默认会将所有的图片资源缓存到内存中,因此,没有必要手动调用.skipMemoryCache( false )了。

       提示:注意到现实情况,如果你要对同一个URL做一个初始化的请求,第一次没使用.skipMemoryCache( true ),然后第二次使用了,将会获取缓存在内存中的资源。当你调整缓存行为的时候,确保请求的都指向同一个资源。

跳过磁盘缓存

       即使你关闭了内存缓存,所请求的图片仍然会被保存在设备的磁盘存储上。如果你有一张不断变化的图片,但是都是用的同一个URL,你可能需要禁止磁盘缓存了。

       可以用.diskCacheStrategy()方法改变Glide的行为。不同于.skipMemoryCache()方法,它将需要从枚举型变量中选择一个,而不是一个简单的boolean。如果你想要禁止请求的磁盘缓存,使用枚举型变量DiskCacheStrategy.NONE作为参数。

1
2
3
4
5
Glide  
.with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into( imageViewInternet );

       上面代码里的图片根本不会被保存在磁盘上。默认情况下它仍然使用内存缓存,为了同时禁止掉两个缓存,结合一下方法:

1
2
3
4
5
6
Glide  
.with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.skipMemoryCache( true )
.into( imageViewInternet );

自定义磁盘缓存行为

       Glide的磁盘缓存是相当复杂的。Picasso只缓存全尺寸图片;Glide会缓存原始、全尺寸的图片和额外的小版本图片。如果你请求一个1000x1000像素的图片,你的ImageView是500x500像素,Glide会保存两个版本的图片到缓存里。

       .diskCacheStrategy()中枚举参数的意义:

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。上面例子里的1000x1000像素的图片
  • DiskCacheStrategy.RESULT 只缓存最终降低分辨后用到的图片
  • DiskCacheStrategy.ALL 缓存所有类型的图片 (默认行为)

       如果有一个图片需要经常处理,会生成各种不同版本的图片,缓存它的原始的分辨率图片才有意义。这样,我们使用DiskCacheStrategy.SOURCE去告诉Glide只缓存原始版本:

1
2
3
4
5
Glide  
.with( context )
.load( eatFoodyImages[2] )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );

单张图片的无效缓存

       由于Glide会缓存一张图片的多个版本的分辨率图片,所以并不好轻易从缓存中删除一个文件,你需要去找到所有这个图片可能有关系的缓存。这是一个相当复杂的处理,可以参考官方wiki在无效缓存上的指导。

参考资料:
签到钱就到 Glide入门教程——7. 缓存基础

Fork me on GitHub