一.glide缓存分为:内存缓存和硬盘缓存 二.在load方法中可以看出先调用内存缓存在加载图片,内存缓存找不到在调用硬盘缓存中加载图片 三.内存缓存 1.缓存key:决定缓存key的参数有十几个(包括url,宽,高,...
一.glide缓存分为:内存缓存和硬盘缓存
二.在load方法中可以看出先调用内存缓存在加载图片,内存缓存找不到在调用硬盘缓存中加载图片
三.内存缓存
1.缓存key:决定缓存key的参数有十几个(包括url,宽,高,signature等等)
EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
transcoder, loadProvider.getSourceEncoder());5
注意:4.4以前是Bitmap复用必须长宽相等才可以复用,而4.4及以后是Size>=所需就可以复用,只不过需要调用reconfigure来调整尺寸
2.默认是开启内存缓存的,可以调用skipMemoryCache(true)关闭缓存
3.内存缓存原理
①.缓存算法:算法是lru算法(当前看不见的图片,用LinkHashMap来存储的)+弱引用算法(当前正在显示的图片,用HashMap来存储的)
②.两个缓存区域:LruResourceCache(lru算法存储区域)+activeResources(弱引用算法存储区域)
③.优先级:LruResourceCache>activeResources
④.查找顺序:先从LruResourceCache中查找,找到了移除并添加到activeResources中,找不到再从activeResources中查找。
⑤.引用计数acquired:acquired()方法让其+1,release()方法让其-1,经过acquired()方法使acquired>0在activeResources中存储,然后不再使用调用release()方法使acquired==0被activeResources移除并且put到LruResourceCache中
⑥.onEngineJobComplete先加载到activeResources中
四.硬盘缓存
1.缓存模式:
3.x
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
4.x
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.DATA: 表示只缓存原始图片。对应上面的DiskCacheStrategy.SOURCE
DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。对应上面的DiskCacheStrategy.RESULT
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)
2.硬盘缓存原理3.x:
①.默认情况先从decodeFromCache()硬盘缓存读取,如果没有读取到则从decodeFromSource()读取原始图片
②.decodeFromCache方法中先调用decodeResultFromCache方法就是对应的DiskCacheStrategy.RESULT模式加载图片,如果获取不到,会再调用decodeSourceFromCache()方法获取缓存,对应的是DiskCacheStrategy.SOURCE模式,注意此处decodeResultFromCache方法中的key是和内存缓存一致的,由十几个参数组成的,decodeSourceFromCache的key是由id和signature这两个参数来构成,大多数情况下signature是一致的可以忽略,所以是由url决定的key。
③.decodeFromSource()读取原始图片后根据判断来进行是否进行硬盘缓存。
Glide使用了DiskCache+MemoryCache+activeResources三级缓存 DiskCache是磁盘缓存,这个不用多说了 MemoryCache和activeResources是两级内存缓存 MemoryCache存储当前没有使用到的Bitmap,当MemoryCache中命中Bitmap...
Glide使用了DiskCache+MemoryCache+activeResources三级缓存
DiskCache是磁盘缓存,这个不用多说了
MemoryCache和activeResources是两级内存缓存
MemoryCache存储当前没有使用到的Bitmap,当MemoryCache中命中Bitmap后,该Bitmap又被缓存至activeResources中,并从MemoryCache中删除
private EngineResourceloadFromCache(Key key, boolean isMemoryCacheable) { if (!isMemoryCacheable) { return null; } EngineResourcecached = getEngineResourceFromCache(key); if (cached != null) { cached.acquire(); activeResources.activate(key, cached); } return cached; }private EngineResourcegetEngineResourceFromCache(Key key) { Resourcecached = cache.remove(key); final EngineResourceresult; if (cached == null) { result = null; } else if (cached instanceof EngineResource) { // Save an object allocation if we've cached an EngineResource (t
Glide缓存原理实现 专注于Android开发,分享经验总结,欢迎加入 Glide使用方式如下: Glide.with(MainActivity.this) .load(path) .into(iv);Glide缓存分为:活动缓存、内存缓存、Bitmap复用池、磁盘缓存...
Glide 缓存原理实现
专注于Android开发,分享经验总结,欢迎加入
Glide使用方式如下: Glide.with(MainActivity.this) .load(path) .into(iv);
Glide缓存分为:活动缓存、内存缓存、Bitmap复用池、磁盘缓存、加载外置(网络或者SD卡)、绑定生命周期
具体的流程如下
资源封装
Key – 对Value的唯一性进行描述
Value – 对Bitmap的封装
活动缓存
// 用容器存储
private HashMapmap = new HashMap