Glide Memory Cache

2021-01-03  本文已影响0人  gczxbb

LruCache 和弱引用

一、ActiveResources

从 LruCache 中获取的 资源 EngineResource,加入弱引用 Map。
ActiveResources 弱引用管理 Map。

get() 时,发现已经被回收,清理
cleanupActiveReference() 方法,清理 ResourceWeakReference。
1,从 Map 移除 该 key。
2,通知 资源 Released。

因为 需要 通知 ResourceListener ,但是 资源以及 被回收了,用 ref 中的 resource,重构新资源 ,EngineResource<?> newResource 通知。

ReferenceQueue 队列
被回收的 EnginResource 加入 ReferenceQueue 队列。
启动清理队列线程 cleanReferenceQueueThread


@Synthetic void cleanReferenceQueue() {
    while (!isShutdown) {
      try {
        ResourceWeakReference ref = (ResourceWeakReference) resourceReferenceQueue.remove();
        mainHandler.obtainMessage(MSG_CLEAN_REF, ref).sendToTarget();

        // This section for testing only.
        DequeuedResourceCallback current = cb;
        if (current != null) {
          current.onResourceDequeued();
        }
        // End for testing only.
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }
  }

while 循环,
ReferenceQueue.remove 方法,休眠,等待 wait()。

队列新增元素时 通知 Handler 主线程,cleanupActiveReference() 方法。

通过 遍历队列,得知被回收,通如上 get() 方法 一样,清理 ResourceWeakReference。

引擎关闭 shutDown

shutdown() 方法,停止线程循环。

清理线程的 interrupt() 方法,触发休眠时中断异常。
清理线程的 join() 方法,等待 cleanReferenceQueueThread 执行5s,再执行。

二、MemoryCache 接口

LruCache,Resource 资源内存 LRU Cache,子类 LruResourceCache。
内部LinkedHashMap,最少使用算法LRU。

put() 方法,

单独资源项已经大于 maxSize,不保存。
保存后更新总量 currentSize。

protected synchronized void trimToSize(long size) {
    Map.Entry<T, Y> last;
    Iterator<Map.Entry<T, Y>> cacheIterator;
    while (currentSize > size) {
      cacheIterator  = cache.entrySet().iterator();
      last = cacheIterator.next();
      final Y toRemove = last.getValue();
      currentSize -= getSize(toRemove);
      final T key = last.getKey();
      cacheIterator.remove();
      onItemEvicted(key, toRemove);
    }
}

while LinkedHashMap 删除某项key-value,确保当前 currentSize 在 小于 size 的范围。
缓存最大值,maxSize。

最大值 设置,根据屏幕分辨率 等计算。例18550080,18M


任重而道远

上一篇下一篇

猜你喜欢

热点阅读