一、作用
/**
* 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;
}