Glide原理分析(二):Engine加载流程

本文深入探讨Glide的Engine加载图片过程,涉及缓存管理,包括Jobs、EngineKey、DecodeJob和EngineJob等数据结构。重点解释了为何使用弱引用缓存以提高命中率,同时阐述了LruCache、DiskLruCache和弱引用缓存的协同工作方式。Glide通过ModelLoader和DataFetcher加载网络数据,最终利用HttpUrlConnection实现资源获取。
摘要由CSDN通过智能技术生成

上一篇文章《Glide原理解析(一):加载流程分析》主要大致地分析了Glide加载图片的整体流程,这一篇主要解决的上一篇遗留的一个问题:

Glide Engine 如何加载图片,内部涉及到Glide的缓存模块

上篇文章在SingleRequest中获取到了ViewTarget的宽高之后(假定是ImageView),onSizeReady()调用了engine的load()方法

loadStatus = engine.load(
        glideContext,
        model,
        requestOptions.getSignature(),
        this.width,
        this.height,
        requestOptions.getResourceClass(),
        transcodeClass,
        priority,
        requestOptions.getDiskCacheStrategy(),
        requestOptions.getTransformations(),
        requestOptions.isTransformationRequired(),
        requestOptions.isScaleOnlyOrNoTransform(),
        requestOptions.getOptions(),
        requestOptions.isMemoryCacheable(),
        requestOptions.getUseUnlimitedSourceGeneratorsPool(),
        requestOptions.getUseAnimationPool(),
        requestOptions.getOnlyRetrieveFromCache(),
        this);

在看Engine的load()方法之前,先看下Engine主要的数据结构

private final Jobs jobs;
负责缓存EngineJob的管理类

private final EngineKeyFactory keyFactory;
负责创建缓存的key

private final DecodeJobFactory decodeJobFactory;
负责创建DecodeJob, DecodeJob负责从缓存或原始资源解码转换

private final EngineJobFactory engineJobFactory;
负责创建EngineJob,EngineJob负责处理DecodeJob的加载结果

private final ResourceRecycler resourceRecycler;
当资源被移除或者释放时,负责回收资源(可能是被回收到其他的LruCache中去)

private final MemoryCache cache;
内部是LruCache缓存

private final LazyDiskCacheProvider diskCacheProvider;
内部是DiskLruCache缓存

private final ActiveResources activeResources;
内部是弱引用缓存,当前活跃的缓存资源

看完了上面的数据结构,开始load()加载资源

// Engine.java
public <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) {
   
	// 根据图像类型、原始宽高、目标宽高、转换等各种因素创建一个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);
      return null;
    }
    // 从LruCache资源获取
    EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
    if (cached != null) {
   
	  // 获取成功,直接回调返回
      cb.onResourceReady(cached, DataSource.MEMORY_CACHE);
      return null;
    }

	// 从DiskLruCache资源获取
    EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值