Glide 三级缓存学习笔记
学习Glide 框架有一段时间,很多时候都是以懵逼的状态放弃源码阅读,然后有从头梳理,简直是一种折磨,最后只能用之忍之了。最近得到一位专家级别的大师指点,终于从雾霾中找到方向了,今天就在此记录一下学习笔记:
Glide 框架的核心就是三层缓冲架构,及生命周期管理,下面详细描述:
1、生命周期管理
Glide不像其他的第三方框架一样,需要你在宿主(Activity/FragmentActivity)的OnStart()、OnStop()、OnDestory()等回调中处理,而是通过在每一个宿主会自动添加一个无内容的Fragment 来进行对生命周期监听,然后根据生命周期的状态进行对缓冲资源的释放;这也是一个很大的改进与方便之处。
2、三级缓冲机制
2.1)活动缓冲
该缓冲其实也是内存缓存,主要是用户存放正在使用的资源的weakreference ,并通过WeakReferenceQueue 来进行对弱引用的监听回调;
引用计数:通过引用计数来处理当前正在使用的资源的次数,如果计数为0 ,则释放资源;
2.2)内存缓冲
内存缓冲是使用LRUCache的最近最少使用算法(核心数据结构:LinkedHashMap)来实现的; 如果活动缓冲中的资源被释放,则会被动加入到内存缓冲中;
2.3 )磁盘缓冲
磁盘缓冲其实就是在SDCard的缓冲目录保存数据,同样采用的LRU的算法;
那么三种缓冲之间是怎么工作的呢?如下图所示:

流程说明:
UI调用Glide加载图片时,首先会在活动缓冲中根据key进行资源加载,若活动缓冲存在,则直接返回UI进行加载,如果没有找到,则在内存缓冲中查询;
如果内存缓冲中存在,则会将内存缓冲中的资源移除,并加入到活动缓冲中,切活动缓冲计数+1;然后再返回UI显示;如果内存缓冲中不存在,则进入磁盘缓冲查询;
磁盘缓冲中如果存在,则会将磁盘缓冲中的资源加入到活动缓冲中,活动缓冲计数+1,并返回UI显示;若磁盘缓冲不存在,则进行外部资源加载(加载网路数据、或者本地资源);
外部资源加载,加载成功,首先会在磁盘缓冲中保存资源,并将磁盘缓冲中的该资源计入到活动缓冲中去;
缓冲说明:
1、资源: 存放key-value形式的资源,key是唯一标识,也是在整个Glide框架中的关键;key的格式是一个类似于加密后密文的字符串;
2、活动缓冲:使用的是对资源的弱引用weakReference+Queue+引用计数的方式进行管理,引用被移除时,会间接加入到内存缓冲中去;
3、内存缓冲:采用的LRU算法进行管理;
4、磁盘缓冲:采用的LRU算法进行资源管理;
以上内容仅是学习glide时的学习笔记,如有不合之处,欢迎留言讨论。
网友评论