Glide4.9.0 ResourceCacheGenerator 源码解析

一、作用

/**
 * Generates {@link com.bumptech.glide.load.data.DataFetcher DataFetchers} from cache files
 * containing downsampled/transformed resource data.
 */

根据官方注释,关键词downsampled/transformed,就是我们获取到经过采样和变换的数据。

二、源码解析

Glide4.9.0源码 整体概述(二)可以看到,ResourceCacheGenerator 的入口方法是startNext,所以我们可以先从这个方法入手。阅读此文建议先看Glide4.9.0 数据转换设计思路
步骤1,Glide4.9.0 getModelLoaders 源码解析解释了获取modelLoaders的过程,
步骤2,Glide4.9.0 SourceGenerator有LoadData相关介绍。

@Override
  public boolean startNext() {
    List<Key> sourceIds = helper.getCacheKeys();
    if (sourceIds.isEmpty()) {
      return false;
    }
    //根据dataclass->resourceclass->transcodeclass路线,寻找出可用的resourceClasses。
    List<Class<?>> resourceClasses = helper.getRegisteredResourceClasses();
    if (resourceClasses.isEmpty()) {
      //resourceClasses为空,已经说明没有办法完成数据流转换
      //可是transcodeclass为File.class就直接返回false,不抛异常,
      //暂时未能理解其中的深意,先留坑。
      if (File.class.equals(helper.getTranscodeClass())) {
        return false;
      }
      throw new IllegalStateException(
         "Failed to find any load path from " + helper.getModelClass() + " to "
             + helper.getTranscodeClass());
    }
    //步骤1,遍历sourceIds,尝试获取缓存FIle,并且通过getModelLoaders寻找是否有合适的modelLoaders。
    while (modelLoaders == null || !hasNextModelLoader()) {
      resourceClassIndex++;
      if (resourceClassIndex >= resourceClasses.size()) {
        sourceIdIndex++;
        if (sourceIdIndex >= sourceIds.size()) {
          return false;
        }
        resourceClassIndex = 0;
      }

      Key sourceId = sourceIds.get(sourceIdIndex);
      Class<?> resourceClass = resourceClasses.get(resourceClassIndex);
      Transformation<?> transformation = helper.getTransformation(resourceClass);
      // PMD.AvoidInstantiatingObjectsInLoops Each iteration is comparatively expensive anyway,
      // we only run until the first one succeeds, the loop runs for only a limited
      // number of iterations on the order of 10-20 in the worst case.
      currentKey =
          new ResourceCacheKey(// NOPMD AvoidInstantiatingObjectsInLoops
              helper.getArrayPool(),
              sourceId,
              helper.getSignature(),
              helper.getWidth(),
              helper.getHeight(),
              transformation,
              resourceClass,
              helper.getOptions());
      cacheFile = helper.getDiskCache().get(currentKey);
      if (cacheFile != null) {
        sourceKey = sourceId;
        modelLoaders = helper.getModelLoaders(cacheFile);
        modelLoaderIndex = 0;
      }
    }

	//步骤2,遍历moderLaders,生成loadData,判断是否可以处理该任务类型转换,
	//然后调用LoadData#DataFetcher#loadData开始任务。
    loadData = null;
    boolean started = false;
    while (!started && hasNextModelLoader()) {
      ModelLoader<File, ?> modelLoader = modelLoaders.get(modelLoaderIndex++);
      loadData = modelLoader.buildLoadData(cacheFile,
          helper.getWidth(), helper.getHeight(), helper.getOptions());
      if (loadData != null && helper.hasLoadPath(loadData.fetcher.getDataClass())) {
        started = true;
        loadData.fetcher.loadData(helper.getPriority(), this);
      }
    }

    return started;
  }
发布了22 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u012591964/article/details/88663160
今日推荐