架构师学习--手写Glide之活动缓存

Glide是目前市场上比较流行的图片加载框架,使用起来很方便,一堆链式调用就可以加载一张网络图片了。第一次加载会比较慢,当我们下次再次加载这张图片的时候,速度将会质的飞跃。这是因为它的图片缓存机制做的非常好。从源码中可以看出,他会用了三级缓存策略,分别是:活动缓存、内存缓存、磁盘缓存。本章将会讲解活动缓存是如何进行设计的

一、缓存策略

说到缓存策略,就不得不说一下,四种引用的区别了:

  1. 强引用
    比如我们使用new操作符或者创建数组的时候,会在堆内存申请一块内存,这块内存是不会被JVM垃圾回收器回收的,如果申请的对象占用内存过大就会出现OOM
  2. 软引用
    当垃圾回收器开始回收的时候,如果对象使用了软引用,那么如果当前占用内存没有超过最大使用内存,将不会被回收,否则将会被回收。
  3. 弱引用
    当垃圾回收器开始回收的时候,如果对象使用了弱引用,该对象将会被回收
  4. 虚引用
    它的作用在于跟踪垃圾回收过程,在对象被收集器回收时收到一个系统通知。 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。 所以可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了。使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等。

我们的活动缓存使用了弱引用,来保存bitmap对象

二、key

当我们将网络图片加载到活动缓存的时候,需要设计一个key,来标识当前缓存中对应的图片,方便下次能够直接取出来用。这里的key表示当前图片的key,必须唯一。代码如下:
在这里插入图片描述
注意这里为了保证key的唯一性,使用了SHA256加密。

三、Value

该类主要保存了图片的bitmap对象,代码如下:
在这里插入图片描述
这里设置了一个计数器count,目的就是:当对象没有不再使用的时候(即值小于或等于0),告诉外界这个对象没有在活动缓存中使用了,可以采取其他缓存策略。
每当我们使用一次对象的时候,需要count进行+1操作,使用完成以后,进行-1操作,所以这个类已提供了这个两个方法,代码如下:
在这里插入图片描述
不再使用该对象的回调接口callback的设计如下:
在这里插入图片描述

四、活动缓存类

在这里插入图片描述
weakReferenceMap:保存当期图片的弱引用集合,key就是上面说到的唯一key,value就是图片对象的弱引用。
mQueue:当弱引用被回收的时候,需要监听被回收的对象,以便从集合weakReferenceMap中进行移除。

1、存

将Value对象存放到map集合中
在这里插入图片描述
这里使用了自定义的CustomWeakReference,而不是直接使用WeakReference。这样做的目的就是为了能够监听到当前对象弱引用被回收的情况。

2、CustomWeakReference

在这里插入图片描述

3、getReferenceQueue

在这里插入图片描述
开启子线程,不断监听当前弱引用对象是否被垃圾回收器回收。mQueue.remove()方法是一个阻塞方法,也就是如果没有回收的话,就会一直等待。否则,从weakReferenceMap集合中移除,属于被动回收。

4、主动回收

在这里插入图片描述
提供给外界主动调用。

5、关闭活动缓存

在这里插入图片描述
此时需要关闭回收线程的轮训任务,并且清空弱引用集合,回收资源。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值