Glide 缓存原理实现
专注于Android开发,分享经验总结,欢迎加入
Glide使用方式如下:
Glide.with(MainActivity.this)
.load(path)
.into(iv);
Glide缓存分为:活动缓存、内存缓存、Bitmap复用池、磁盘缓存、加载外置(网络或者SD卡)、绑定生命周期
具体的流程如下
* 资源封装
Key -- 对Value的唯一性进行描述
Value -- 对Bitmap的封装
* 活动缓存
// 用容器存储
private HashMap<String, WeakReference<Value>> map = new HashMap<>();
// 继承WeakReference(目的:为了监听这个弱引用 是否被回收了)
public class CustomWeakReference extends WeakReference {
public String key;
public CustomWeakReference(Object referent, ReferenceQueue queue, String key) {
super(referent, queue);
this.key = key;
}
}
/**
* 目的:为了监听这个弱引用 是否被回收了
* queue.remove() 会阻塞线程
*
* @return
*/
public ReferenceQueue<Value> getQueue() {
if (queue == null) {
queue = new ReferenceQueue<>();
// 监听这个弱引用 是否被回收了
thread = new Thread() {
@Override
public void run() {
while (!isCloseThread) {
if (!isShoudonRemove) {
try {
// 阻塞式的方法,被动调用queue.remove(),进行回收
Reference<? extends Value> remove = queue.remove();
CustomWeakReference customWeakReference = (CustomWeakReference) remove;
if (map != null && !map.isEmpty()) {
// 移除容器 !isShoudonRemove:为了区分手动移除 和 被动移除
map.remove(customWeakReference.key);
}
Log.d(TAG, "getQueue remove ");
} catch (InterruptedException e) {
Log.d(TAG, "getQueue InterruptedException e :" + e.getMessage());
e.printStackTrace();
}
}
}
}