版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
android专栏收录该内容
48 篇文章0 订阅
订阅专栏
本文主要介绍了如何配置和管理Glide中的缓存,其中大部分内容都可以直接在官方Wiki中找到,这里只是进行了整理和汇总。言归正传,Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。

磁盘缓存

一般的图片缓存指的就是磁盘缓存,把网络上的图片缓存到本地,这样就不需要每次都从网络加载,既提高了加载速度,又为用户节省了流量。
Glide在默认情况下是开启磁盘缓存的,而且提供了丰富的API来让开发者自己配置和管理磁盘缓存。
缓存位置和大小
开发者可以通过构建一个自定义的GlideModule来配置Glide磁盘缓存的位置和大小。最简单的方法如下:
publicclassDiskCacheMoudleimplementsGlideModule{@Overridepublicvoid applyOptions(Context context,GlideBuilder builder){builder.setDiskCache(newInternalCacheDiskCacheFactory(context,"glide_cache",100*1024*1024));//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));}@Overridepublicvoid registerComponents(Context context,Glide glide){}}
其中第二个参数为缓存的目录名称,第三个参数为缓存大小,单位是Byte。
InternalCache构建的缓存是在应用的内部储存,而ExternalCache则是在外部储存。
如果不想把缓存放在上面的两个位置怎么办?Glide当然也支持,具体通过DiskLruCacheFactory来实现:
builder.setDiskCache(newDiskLruCacheFactory(newDiskLruCacheFactory.CacheDirectoryGetter(){@OverridepublicFile getCacheDirectory(){return getMyCacheLocationBlockingIO();}}),100*1024*1024);
Note: getMyCacheLocationBlockingIO方法返回的文件不能为空,而且必须是一个已经创建好的文件目录,不可以是文件。

磁盘缓存策略

与其他图片加载库的缓存机制不同,Glide缓存图片时默认只缓存最终加载的那张图片。举个栗子,你要加载的图片分辨率为1000x1000,但是最终显示该图片的ImageView大小只有500x500,那么Glide就会只缓存500x500的小图。这也是在从磁盘缓存中加载图片时Glide比Picasso快的原因。
不过,你可以改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸:
Glide.diskCacheStrategy(DiskCacheStrategy.ALL)
Glide目前提供了四种缓存策略:
DiskCacheStrategy.NONE 不缓存文件
DiskCacheStrategy.SOURCE 只缓存原图
DiskCacheStrategy.RESULT 只缓存最终加载的图(默认的缓存策略)
DiskCacheStrategy.ALL 同时缓存原图和结果图

磁盘缓存算法

在Glide中磁盘缓存默认使用的是LRU(Least Recently Used)算法。如果你想使用其他的缓存算法,就只能通过实现DiskCache接口来完成了。

内存缓存

使用内存缓存可以获得更快的图片加载速度,因为减少了耗时的IO操作。众所周知,Bitmap是Android中的内存大户,频繁的创建和回收Bitmap必然会引起内存抖动。Glide中有一个叫做BitmapPool的类,可以复用其中的Bitmap对象,从而避免Bitmap对象的创建,减小内存开销。
当配置内存缓存时,我们也应该同时配置BitmapPool的大小。具体方法也是通过自定义的GlideModule来实现的:
builder.setMemoryCache(newLruResourceCache(yourSizeInBytes));builder.setBitmapPool(newLruBitmapPool(sizeInBytes));
一般情况下,开发者是不需要自己去指定它们的大小的,因为Glide已经帮我们做好了。默认的内存缓存和BitmapPool的大小由MemorySizeCalculator根据当前设备的屏幕大小和可用内存计算得到。同时Glide还支持动态的缓存大小调整,在存在大量图片的Activity/Fragment中,开发者可以通过setMemoryCategory方法来提高Glide的内存缓存大小,从而加快图片的加载速度。
Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);
MemoryCategory有3个值可供选择:
MemoryCategory.HIGH(初始缓存大小的1.5倍)
MemoryCategory.NORMAL(初始缓存大小的1倍)
MemoryCategory.LOW(初始缓存大小的0.5倍)
在有些情况下我们不希望做内存缓存(比如加载GIF图片),这个时候可以调用skipMemoryCache(true)方法跳过内存缓存。