Android | Glide3与Glide4缓存配置

  磁盘缓存、内存缓存与BitmapPool都是使用LRU算法,Glide维护每个缓存的引用计数,当缓存将超过容量限制时,引用计数最少的缓存被释放。

磁盘缓存(Disk Cache)

  • 默认配置
    1、存储位置:内部存储
    2、最大LRU磁盘缓存容量:250MB(DEFAULT_DISK_CACHE_SIZE
    3、路径名:“image_manager_disk_cache”(DEFAULT_DISK_CACHE_DIR
  • 修改配置
//内部存储
builder.setDiskCache(
  new InternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));

//外部存储
builder.setDiskCache(
  new ExternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));

//InternalCacheDiskCacheFactory为内部存储,ExternalCacheDiskCacheFactory为外部存储
//cacheDirectoryName:配置路径名
//yourSizeInBytes:配置最大容量
  • 修改磁盘缓存策略
v3
缓存策略 描述
ALL 同时保存未修改的原始图片与修改后的图片
NONE 取消磁盘缓存
SOURCE 仅保存未修改的原始图片
RESULT(默认) 仅保存修改后的图片
Glide.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);
v4
缓存策略 描述
ALL 对于远程图片,同时保存未修改的原始图片和修改后的图片;对于本地图片,仅保存修改后的图片
NONE 取消磁盘缓存
DATA 仅保存未修改的原始图片
RESOURCE 仅保存修改后的图片
AUTOMATIC(默认) 默认情况与ALL相同
GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);
  • 清理磁盘缓存(在后台线程)
Glide.get(applicationContext).clearDiskCache();
  • 仅从磁盘或内存缓存中获取(v4有效)
GlideApp.with(this)
                .load("")
                .onlyRetrieveFromCache(true)
                .into(imageView)

内存中缓存

  • 系统划分给进程的可用内存容量:基于硬件不同,取值为16MB、24MB或者更高。
  • Glide从可用内存容量中取一部分作为最大内存占用量:
v3
设备 最大内存占用量
低内存设备 可用内存容量*0.33F
非低内存设备 可用内存容量*0.4F
v4
设备 默认最大内存占用量 可自定义最大内存占用量
低内存设备 可用内存容量*0.33F 可用内存容量*比例
非低内存设备 可用内存容量*0.4F 可用内存容量*比例
  • 最大内存占用量分配给内存缓存与位图池缓存

  显示一个屏幕所有像素需要的内存为screenSize。

v3
未超过最大内存占用量 超过最大内存占用量
Memory Cache screenSize*2屏 最大内存占用量*2/6
BitmapPool screenSize*4屏 最大内存占用量*4/6
v4

Android O之前

未超过最大内存占用量 超过最大内存占用量
Memory Cache screenSize*2屏 最大内存占用量*2/6
BitmapPool screenSize*4屏 最大内存占用量*4/6

Android O之后

未超过最大内存占用量 超过最大内存占用量
Memory Cache screenSize*2屏 最大内存占用量*2/3
BitmapPool screenSize*1屏 最大内存占用量*1/3

v4可用自定义屏幕数

  • 动态调整容量
Glide.get(context).setMemoryCategory(MemoryCategory);
MemoryCategory 描述
LOW 使用初始容量的一半
NORMAL 使用初始容量
HIGH 使用初始容量的1.5倍

内存缓存(Memory Cache)

  • 配置初始容量
v3
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize );
v4
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize );

  或

MemorySizeCalculator.Builder builder= new MemorySizeCalculator.Builder(context);
builder.setMemoryCacheScreens(int);//内存缓存的屏数
builder.setBitmapPoolScreens(int);//BitmapPool的屏数
builder.setMaxSizeMultiplier(float);//从进程可用内存划分的比例
builder.setLowMemoryMaxSizeMultipiler(float);//低内存设备时从进程可用内存划分的比例
builder.setMemoryCache(builder.build().getMemoryCacheSize());
  • 取消内存缓存
v3
Glide.with(fragment)
  .load(url)
  .skipMemoryCache(false)
  .into(imageView);
v4
GlideApp.with(fragment)
  .load(url)
  .skipMemoryCache(false)
  .into(imageView);
  • 清理内存缓存(在主线程)
Glide.get(applicationContext).clearMemory();

位图池缓存(BitmapPool)

  • 配置初始容量
v3
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize ));
v4
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize ));

  或

MemorySizeCalculator.Builder builder= new MemorySizeCalculator.Builder(context);
builder.setMemoryCacheScreens(int);//内存缓存的屏数
builder.setBitmapPoolScreens(int);//BitmapPool的屏数
builder.setMaxSizeMultiplier(float);//从进程可用内存划分的比例
builder.setLowMemoryMaxSizeMultipiler(float);//低内存设备时从进程可用内存划分的比例
builder.setMemoryCache(builder.build().getBitmapPoolSize());

缓存刷新问题

  因为磁盘缓存使用的是哈希键,所以并没有一个比较好的方式来简单地删除某个特定url或文件路径对应的所有缓存文件。如果你只允许加载或缓存原始图片的话,问题可能会变得更简单,但因为Glide还会缓存缩略图和提供多种变换(transformation),它们中的任何一个都会导致在缓存中创建一个新的文件,而要跟踪和删除一个图片的所有版本无疑是困难的。
  使用签名插入到哈希键中来控制缓存刷新。

GlideApp.with(fragment)
    .load(mediaStoreUri)
    .signature(new MediaStoreSignature(mimeType, dateModified, orientation))
    .into(view);
MediaStoreSignature(String mimeType, long dateModified, int orientation)
StringSignature(String signature)
v4
ObjectKey(Object object)

v3和v4的配置API差异

v3

  v3使用GlideModule接口实现懒配置,步骤:

  • 1、实现GlideModule接口,在applyOptions(…)方法中应用配置选项(如缓存配置选项),在registerComponents(…)方法中注册ModelLoaders;
  • 2、添加对GlideModule接口的混淆忽略;
  • 3、在AndroidManifest.xml中的<application>下添加meta-data,name属性值为类名,value属性值固定为“GlideModule”。

  所谓懒配置,即直到应用首次发起Glide请求,才会自动地进行配置。Glide先遍历AndroidManifest.xml中<application>下所有的<meta-data>,匹配value为“GlideModule”的meta-data。再利用其中的name属性,通过反射机制得到该GlideModule子类的实例。(源码:ManifestParser类)

v4

  v4使用编译时注解避免运行时遍历meta-data的过程。
  v3使用一个或多个GlideModule完成配置,v4使用有且只有一个AppGlideModule加可选的多个LibraryGlideModule完成配置。
  v4的注解编译器在编译时汇总AppGlideModule类和LibraryGlideModule类中的配置逻辑,生成类名为GeneratedAppGlideModuleImpl的配置类。在运行时懒配置触发时,Glide反射这个自动生成的类,完成配置。
  步骤:

  • 1、实现AppGlideModule接口,在applyOptions(…)方法中应用配置选项(如缓存配置选项),在registerComponents(…)方法中注册ModelLoaders;
  • 2、可选地实现LibraryGlideModule接口,在registerComponents(…)方法中注册ModelLoaders;
  • 3、实现AppGlideModule和LibraryGlideModule接口时需要添加@GlideModule注解
  • 4、添加混淆忽略

  v4关闭解析AndroidManifest.xml的步骤:重写AppGlideModule#isManifestParsingEnabled(),返回false。


推荐阅读


感谢喜欢!你的点赞是对我最大的鼓励!欢迎关注彭旭锐的简书!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容