Android Glide 中内存缓存为什么有 activeRe

2023-07-20  本文已影响0人  雁过留声_泪落无痕

背景

版本:4+

问题

为什么设计了 ActiveResources activeResourcesMemoryCache cache 两种类型的缓存?

Engine.java

private EngineResource<?> loadFromMemory(
      EngineKey key, boolean isMemoryCacheable, long startTime) {
    if (!isMemoryCacheable) {
      return null;
    }

    EngineResource<?> active = loadFromActiveResources(key);
    if (active != null) {
      if (VERBOSE_IS_LOGGABLE) {
        logWithTimeAndKey("Loaded resource from active resources", startTime, key);
      }
      return active;
    }

    EngineResource<?> cached = loadFromCache(key);
    if (cached != null) {
      if (VERBOSE_IS_LOGGABLE) {
        logWithTimeAndKey("Loaded resource from cache", startTime, key);
      }
      return cached;
    }

    return null;
  }

分析

ActiveResources activeResources 是基于弱引用的(GC 会回收) ,可以一直存,直到 GC,表示正在使用的图片;MemoryCache cache 是基于 LRU 的,有容量限制,但是 GC 不会回收;所以二者相互配合:

  1. 能不能只用 activeResources
    不能。一旦 GC,所有图片都要从头加载(假设有磁盘缓存,则从磁盘重新走一遍加载流程)。但是此时若果有 cache 则不一样了,它不会受 GC 影响,可以拿过来直接用。

  2. 能不能只用 cache
    不能。毕竟 cache 是有大小限制的,考虑如下场景:列表中要显示 10 张图片,但是第 1 张和第 10 张时同一个图片,然而由于 10 张图片都不小,导致超过了缓存大小限制,那么会出现缓存第 9 张图片时,就把第 1 张图片剔除缓存了,当要加载第 10 张图片时,不得不又去从头加载。但是如果此时有 activeResources 则不一样了,因为该图片时正在使用的图片(第 1 张正在使用),所以直接拿过来用就行了。

参考

开源框架 | Glide 的三级缓存 - 简书 (jianshu.com)

上一篇下一篇

猜你喜欢

热点阅读