hello:大家好我是 小小小小小鹿,一枚菜鸡Android程序猿。最近正在阅读Glide源码,今天我们要研究的部分是Glide StringLoader。
说起StringLoader如果没有自定义过Glide ModelLoader 可能并不知道这个是什么。在Glide数据输入输出 我们提到过
ModelLoader: 是一个泛型接口,最直观的翻译是模型加载器。ModelLoader标记了它能够加载什么类型的数据,以及加载后返回什么样的数据类型。
那么StringLoader就是能够将输入类型是String的数据进行加载。但是在Glide数据输入输出
我们定义 VideoAssetUriLoader加载视频asset目录下的首帧图的时候,输入一个String 也能够进行正确的加载这个到底是为什么,难道我们对于ModelLoader的认知是错误的吗?
ModelLoader的获取过程
ModelLoader的获取会经历以下过程:
- 从ModelLoaderRegistry获取指定输入类型的ModelLoader
- 调用ModelLoader#handles判断能否真正处理当前model
这里就不粘贴源码:参考Registry#getModelLoaders,有兴趣可以自己看。
StringLoader的实现
既然ModelLoader的获取是根据输入类型来决定的,那么我们输入字符串String的时候应该获取到的是一个StringLoader,我们猜测 它能加载我们的 VideoAssetUriLoader必然是在StringLoader实现了一些特别的逻辑处理。通过StringLoader代理我们的 VideoAssetUriLoader
通过查看代码StringLoader内部有三个实现了ModelLoaderFactory的内部类。他们都构建了一个输入类型为Uri的MoldelLoader
以AssetFileDescriptorFactory为例:
public static final class AssetFileDescriptorFactory
implements ModelLoaderFactory<String, AssetFileDescriptor> {
@Override
public ModelLoader<String, AssetFileDescriptor> build(
@NonNull MultiModelLoaderFactory multiFactory) {
return new StringLoader<>(multiFactory.build(Uri.class, AssetFileDescriptor.class));
}
@Override
public void teardown() {
// Do nothing.
}
}
可以发现通过在构造方法中传入输入类型是Uri的MoldeLoader,而AssetFileDescriptorFactory构建的输入,类型是Uri输出类型是AssetFileDescriptor,恰好与我们定义的 VideoAssetUriLoader输入输出相对应,因此通过输入String也能够加载asset目录下的视频资源。