Android 开发之Glide《四》ModelLoader

一、ModelLoader

在这里插入图片描述
翻译过来就是将复杂数据模型转换为具体的数据。
数据模型就是资源的地址,这个地址一般是url,但是也可以是任何自定义的类,如果是一个自定义一的类,那么我们就必须提供对用的LoadData。这个LoadData 负责加载根据资源的地址获取到对应的数据。

Glide 默认的资源地址类型可以是URL,URL,String ,GlideUrl。

在这里插入图片描述

例如

       Glide.with(this).load("https://n1image.hjfile.cn/zhuanti/2020/11/16/0f75025c52f35ba742e46e84a2aea628.png") .into(imageView);
   
   

在这里插入图片描述

这里load 的参数是String 类型的,实际山load 有很多的重载方法,他的参数可以是任何类型。
在这里插入图片描述

SourceGenerator
在这里插入图片描述

在真正下载图片的时候会遍历Glide里面注册的所有的ModelLoader,知道支持对应类型的ModelLoader,然后调用对应ModelLoader的buildLoadData 方法获取所有的LoadData,每一种LoadData 提供一种获取资源的方法。
例如有两个支持String 类型ModelLoader分别是ModelLoader-1,ModelLoader-2。ModelLoader-1 内部是通过OKHttp 下载资源而ModelLoader-2是通过HttpClient 下载资源。

在这里插入图片描述

在这里插入图片描述

虽然可能存在多个可用的LoadData,但是这里默认使用的列表里面的第一个。

下面我们看看Glide 是如何解析String 类型的Model

在这里插入图片描述

 private final ModelLoader<Uri, Data> uriLoader;
  @Override
  public LoadData<Data> buildLoadData(@NonNull String model, int width, int height,
      @NonNull Options options) {
    Uri uri = parseUri(model);
    return uri == null ? null : uriLoader.buildLoadData(uri, width, height, options);
  }

也就是Glide.with(this).load(“https://n1image.hjfile.cn/zhuanti/2020/11/16/0f75025c52f35ba742e46e84a2aea628.png”) .into(imageView); 中load 中的字符串会被转换为Uri, 然后调用uriLoader 的buildLoadData。uriLoader 实际类型是UrlUriLoader。
在这里插入图片描述

  @Override
  public LoadData<Data> buildLoadData(@NonNull Uri uri, int width, int height,
      @NonNull Options options) {
    GlideUrl glideUrl = new GlideUrl(uri.toString());
    return urlLoader.buildLoadData(glideUrl, width, height, options);
  }

此处的urlLoader 实际类型是HttpGlideUrlLoader。

  @Override
  public LoadData<InputStream> buildLoadData(@NonNull GlideUrl model, int width, int height,
      @NonNull Options options) {
    // GlideUrls memoize parsed URLs so caching them saves a few object instantiations and time
    // spent parsing urls.
    GlideUrl url = model;
    if (modelCache != null) {
      url = modelCache.get(model, 0, 0);
      if (url == null) {
        modelCache.put(model, 0, 0, model);
        url = model;
      }
    }
    int timeout = options.get(TIMEOUT);
    return new LoadData<>(url, new HttpUrlFetcher(url, timeout));
  }

HttpUrlFetcher 内部通过UrlConnection 访问网络。

最终我们也可以知道Stringl Url,Uri 最终都会被转换为GlideUrl,而GlideUrl 最终通过HttpUrlFetcher 来下载对应的图片。
加入我们想要通过OKHttp 访问网络,那么我们可以按照下面的方式配置

    implementation "com.github.bumptech.glide:okhttp3-integration:4.11.0"
       Registry registry= Glide.get(this).getRegistry();
        OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
        //删除系统默认的HttpGlideUrlLoader,使用OkHttpUrlLoader
        registry.replace(GlideUrl.class, InputStream.class,
                new OkHttpUrlLoader.Factory(okHttpClient));

        ImageView imageView=new ImageView(null);
        Glide.with(this).load("https://n1image.hjfile.cn/zhuanti/2020/11/16/0f75025c52f35ba742e46e84a2aea628.png") .into(imageView);

关于OkHttpUrlLoader 大家可以自行查阅。

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值