Glide缓存机制浅析

作者: w达不溜w | 来源:发表于2021-04-20 17:32 被阅读0次
Glide.with(this).load(imageUrl).into(imageView);

into调用链:

  into(imageView)
—>RequestBuilder#into(...)
—>requestManager.track(target, request)
—>RequestTracker#runRequest()
—>request.begin()
—>SingleRequest#begin()
—>onSizeReady()
—>engine.load

来到Engine的load

public synchronized <R> LoadStatus load(
      GlideContext glideContext,
      Object model,
      Key signature,
      int width,
      int height,
      Class<?> resourceClass,
      Class<R> transcodeClass,
      Priority priority,
      DiskCacheStrategy diskCacheStrategy,
      Map<Class<?>, Transformation<?>> transformations,
      boolean isTransformationRequired,
      boolean isScaleOnlyOrNoTransform,
      Options options,
      boolean isMemoryCacheable,
      boolean useUnlimitedSourceExecutorPool,
      boolean useAnimationPool,
      boolean onlyRetrieveFromCache,
      ResourceCallback cb,
      Executor callbackExecutor) {
    
    long startTime = VERBOSE_IS_LOGGABLE ? LogTime.getLogTime() : 0;
    //①构建缓存key
    EngineKey key = keyFactory.buildKey(model, signature, width, height, transformations,
        resourceClass, transcodeClass, options);
    //②从活动缓存中查找
    EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
    //获取成功就回调出去
    if (active != null) {
      cb.onResourceReady(active, DataSource.MEMORY_CACHE);
      if (VERBOSE_IS_LOGGABLE) {
        logWithTimeAndKey("Loaded resource from active resources", startTime, key);
      }
      return null;
    }
    //③从内存缓存中查找
    EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
    //如果从内存缓存找到相应资源就回调出去
    if (cached != null) {
      cb.onResourceReady(cached, DataSource.MEMORY_CACHE);
      if (VERBOSE_IS_LOGGABLE) {
        logWithTimeAndKey("Loaded resource from cache", startTime, key);
      }
      return null;
    }
    //④从磁盘缓存中查找(耗时,所以放在任务线程中)
    EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache);
    if (current != null) {
      //如果有回调出去
      current.addCallback(cb, callbackExecutor);
      if (VERBOSE_IS_LOGGABLE) {
        logWithTimeAndKey("Added to existing load", startTime, key);
      }
      return new LoadStatus(cb, current);
    }

    //上面的3种方式都没有获取到,就构建一个新的请求任务。
    //创建执行任务
    EngineJob<R> engineJob =
        engineJobFactory.build(
            key,
            isMemoryCacheable,
            useUnlimitedSourceExecutorPool,
            useAnimationPool,
            onlyRetrieveFromCache);
    //创建解码工作,用于处理图片的
    DecodeJob<R> decodeJob =
        decodeJobFactory.build(
            glideContext,
            model,
            key,
            signature,
            width,
            height,
            resourceClass,
            transcodeClass,
            priority,
            diskCacheStrategy,
            transformations,
            isTransformationRequired,
            isScaleOnlyOrNoTransform,
            onlyRetrieveFromCache,
            options,
            engineJob);
        //缓存请求任务
    jobs.put(key, engineJob);
        //添加执行任务的回调
    engineJob.addCallback(cb, callbackExecutor);
    //开始执行
    engineJob.start(decodeJob);

    if (VERBOSE_IS_LOGGABLE) {
      logWithTimeAndKey("Started new load", startTime, key);
    }
    return new LoadStatus(cb, engineJob);
  }

Glide的三级缓存:

活动缓存:使用弱引用缓存图片,表正在使用的图片,图片回收后,保存到内存缓存中。(活动缓存存在的意义:防止内存缓存因LRU策略,正在使用的图片被回收的问题

内存缓存:如果活动缓存找不到图片,就从内存缓存中查找,找到后”移动“到活动缓存。

磁盘缓存:上面两级缓存都没找到,就从磁盘缓存中查找,找到后”复制“到活动缓存。

glide缓存机制.png

相关文章

  • Glide缓存机制浅析

    前言 由于最近项目加载图片这一块用到了Glide框架,以前也用到过,其最核心的部分应该是属于缓存的机制,最近花了点...

  • Glide缓存机制浅析

    into调用链: 来到Engine的load Glide的三级缓存: 活动缓存:使用弱引用缓存图片,表正在使用的图...

  • Glide 加载相同的URL导致无法更新图片问题

    简介:Glide在加载图片的时候默认使用了缓存机制。Glide的缓存机制分为二级:内存缓存、磁盘缓存。缓存的过程是...

  • Glide实现原理

    一.Glide缓存机制 Glide采取的多级缓存机制,能够较为友好地实现图片、动图的加载。其主要有 内存缓存+磁盘...

  • Glide源码分析

    一、源码分析:1、with()2、load()3、into()二、缓存机制1、Glide缓存机制简介1.1缓存的图...

  • Android 【手撕Glide】--Glide缓存机制(面试)

    本文源码解析基于Glide 4.6.1 系列文章Android 【手撕Glide】--Glide缓存机制Andro...

  • Glide 面试题

    1. 简单介绍一下Glide缓存 Glide 缓存机制主要分为2种:内存缓存和磁盘缓存使用内存缓存的原因是:防止应...

  • glide4.7.1解析

    本文章整理:Android源码分析:手把手带你分析 Glide的缓存功能 1. Glide缓存机制简介 1.1 缓...

  • Glide->02Bitmap复用

    参考文章: Glide源码分析之缓存处理 Glide缓存机制 一、源码解析: 如果是第一次加载图片, 即不存在缓存...

  • Android图片框架之Glide

    Gilde缓存机制 Glide缓存分为内存缓存和磁盘缓存,其中内存缓存是由弱引用+LruCache组成。 取的顺序...

网友评论

    本文标题:Glide缓存机制浅析

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