2020-03-26 Glide学习笔记

2020-03-30  本文已影响0人  初夏的雪

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时的学习笔记,如有不合之处,欢迎留言讨论。

上一篇 下一篇

猜你喜欢

热点阅读