Glide 源码解析 之 ModelLoader

在DataFetcherGenerator.startNext()加载数据时(以实现类SourceGenerator为例)会通过DecodeHelper去拿ModelLoader,然后拿到DataLoader,然后使用DataLoader中的fetcher去load数据。
ModelLoader 有着非常多的实现(如下图),加载数据的过程中是如何拿到所需要的实现呢?

每个 ModelLoader 的实现类 在其build方法中,将对应的 DataFetcher 实现类传入DataLoader中。
从下图可以看到,Registry有个方法getModelLoaders(),可以通过model拿到对应的 ModelLoader,其背后实现是 ModelLoaderRegistry。
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
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值