Glide系列-活动缓存和内存缓存

1.活动缓存数据结构用的HashMap

java 复制代码
final class ActiveResources {
    @VisibleForTesting final Map<Key, ResourceWeakReference> activeEngineResources = new             
                 HashMap<>();
}

2.内存缓存LinkedHashMap

java 复制代码
public class LruCache<T, Y> {
    private final Map<T, Entry<Y>> cache = new LinkedHashMap<>(100, 0.75f, true);
}

3.从活动或者内存缓存读取

java 复制代码
public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {

    private EngineResource<?> loadFromMemory( EngineKey key, boolean isMemoryCacheable, 
       long startTime) {
        if (!isMemoryCacheable) {//是否支持内存缓存
            return null;
        }

        EngineResource<?> active = loadFromActiveResources(key);//从活动缓存获取
        if (active != null) {//如果活动缓存不为null
            return active;
        }

        EngineResource<?> cached = loadFromCache(key);//从内存缓存获取
        if (cached != null) { //如果内存缓存不为null
            return cached; 
        }

        return null;
    }
}

4.从活动缓存获取

java 复制代码
public class Engine
    implements EngineJobListener,
        MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
    @Nullable
    private EngineResource<?> loadFromActiveResources(Key key) {
        EngineResource<?> active = activeResources.get(key); //从活动缓存获取
        if (active != null) {
            active.acquire();
        }

        return active;
    }
}
  

5.从内存缓存获取

  • 从活动缓存中移除这个元素
  • 返回
  • 将获得的元素放入活动缓存
java 复制代码
public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
    private EngineResource<?> loadFromCache(Key key) {
        EngineResource<?> cached = getEngineResourceFromCache(key); //获得内存缓存
        if (cached != null) {
            cached.acquire();
            activeResources.activate(key, cached);//放入活动缓存
        }
        return cached;
    }
}
    
java 复制代码
public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {

    private EngineResource<?> getEngineResourceFromCache(Key key) {
        Resource<?> cached = cache.remove(key);//从内存缓存移除

        final EngineResource<?> result; //返回的元素是新建的
        if (cached == null) {
            result = null;
        } else if (cached instanceof EngineResource) {
          // Save an object allocation if we've cached an EngineResource 
          //(the typical case).
            result = (EngineResource<?>) cached;
        } else {
            result = new EngineResource<>(
              cached,
              /* isMemoryCacheable= */ true,
              /* isRecyclable= */ true,
              key,
              /* listener= */ this);
        }
        return result;
    }
}

6.总结

  • 先从活动缓存读取;
  • 如果活动缓存读取到的为null,再从内存缓存读取;
  • 从内存缓存读取的时候,会将缓存的值从内存缓存移除,再放入活动缓存;
相关推荐
CjQYqIyjLwCW20 小时前
Halcon联合C#开发最新版实用框架 实际项目应用验证过的版本,源码,修改了大量Bug以适合...
glide
a31582380616 天前
Android 大图显示策略优化显示(二)
android·java·开发语言·javascript·kotlin·glide·图片加载
青春勿语1 个月前
Lumen:重新定义 Android 图片加载体验
android·glide
灵感菇_1 个月前
Android图片加载框架 Glide全面解析
android·缓存·glide
Lei活在当下1 个月前
【项目踩坑实录】并发环境下,Glide缓存引起的图片加载异常
android·debug·glide
某空m1 个月前
【Android】Glide的缓存机制
android·缓存·glide
某空m1 个月前
【Android】Glide的使用
android·glide
胖虎15 个月前
Android入门到实战(六):Android主流图片加载框架
android·glide·android图片加载
webbin5 个月前
Glide GifDrawable加载流程
android·glide
安卓开发者5 个月前
Android Glide最佳实践:高效图片加载完全指南
android·glide