美文网首页
Android Glide 中内存缓存为什么有 activeRe

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

作者: 雁过留声_泪落无痕 | 来源:发表于2023-07-20 17:12 被阅读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)

    相关文章

      网友评论

          本文标题:Android Glide 中内存缓存为什么有 activeRe

          本文链接:https://www.haomeiwen.com/subject/drjzudtx.html