在DataFetcherGenerator.startNext()加载数据时(以实现类SourceGenerator为例)会通过DecodeHelper去拿ModelLoader,然后拿到DataLoader,然后使用DataLoader中的fetcher去load数据。
ModelLoader 有着非常多的实现(如下图),加载数据的过程中是如何拿到所需要的实现呢?
ModelLoaderRegistry 会先从ModelLoaderCache中取,如果没有,会调用MultiModelLoaderFactory 去build,同时往cache存一份。 拿到 ModelLoader 后,就调用其build方法生成 DataLoader, 之后就可以用DataLoader中的fetcher去load数据了。
@startuml
class GlideContext {
Registry registry
}
class Registry {
ModelLoaderRegistry modelLoaderRegistry
public <Model> List<ModelLoader<Model, ?>> getModelLoaders(@NonNull Model model)
}
class ModelLoaderRegistry {
MultiModelLoaderFactory multiModelLoaderFactory
ModelLoaderCache cache
public <A> List<ModelLoader<A, ?>> getModelLoaders(@NonNull A model)
}
class ModelLoaderCache {
public <Model> void put(Class<Model> modelClass, List<ModelLoader<Model, ?>> loaders)
public <Model> List<ModelLoader<Model, ?>> get(Class<Model> modelClass)
}
class MultiModelLoaderFactory {
List<Entry<?, ?>> entries
<Model> List<ModelLoader<Model, ?>> build(Class<Model> modelClass)
}
class Entry<Model, Data> {
Class<Model> modelClass;
Class<Data> dataClass;
ModelLoaderFactory<? extends Model, ? extends Data> factory;
}
interface ModelLoaderFactory<T, Y> {
ModelLoader<T, Y> build(@NonNull MultiModelLoaderFactory multiFactory);
}
interface ModelLoader<Model, Data> {
LoadData<Data> buildLoadData(@NonNull Model model, int width, int height,
@NonNull Options options);
}
class LoadData<Data> {
Key sourceKey;
List<Key> alternateKeys;
DataFetcher<Data> fetcher;
}
interface DataFetcher<T> {
void loadData(@NonNull Priority priority, @NonNull DataCallback<? super T> callback);
void cleanup();
void cancel();
}
GlideContext --> Registry : has
Registry --> ModelLoaderRegistry : has
ModelLoaderRegistry --> MultiModelLoaderFactory : has
ModelLoaderRegistry --> ModelLoaderCache : has
MultiModelLoaderFactory "1"*-->"n" Entry : contains
Entry --> ModelLoaderFactory : has
ModelLoaderFactory --> ModelLoader : create
ModelLoader --> LoadData : create
LoadData --> DataFetcher : has
@enduml
复制代码