Glide 图片加载库源码分析3-load 方法创建加载请求

先说前面分析的 Glide 的 with 方法,返回的是 RequestManager 对象,但实际上经过 GlideApp 的包装,被转型成了 GlideReuqests 对象。

public static RequestManager with(@NonNull FragmentActivity activity) {
    return getRetriever(activity).get(activity);
}
public static GlideRequests with(@NonNull FragmentActivity activity) {
    return (GlideRequests) Glide.with(activity);
}

GlideRequests 继承自 RequestManager,是通过 APT 生成的类,这里面包括了我们通过注解扩展出的功能方法,但默认没有扩展的情况下,其实它就等价于 RequestManager。

这样子的话就明确了 load 方法是 GlideRequests 提供的,

public GlideRequest<Drawable> load(@Nullable String string) {
    return (GlideRequest<Drawable>) super.load(string);
}

通过调用父类的方法,将返回结果转型为 GlideRequest<Drawable>。

public RequestBuilder<Drawable> load(@Nullable String string) {
    return asDrawable().load(string);
}
public RequestBuilder<Drawable> asDrawable() {
    return as(Drawable.class);
}
public <ResourceType> RequestBuilder<ResourceType> as(Class<ResourceType> resourceClass) {
    return new RequestBuilder<>(glide, this, resourceClass, context);
}

调用 asDrawable 方法来获取一个 RequestBuilder 对象,RequestBuilder 是个泛型类,支持多种资源类型,例如 File, Bitmap, Gif,在这里是通过 as-xxx 方法表现的,但最终都会通过 as 这个泛型方法来实现。

这个泛型方法的泛型命名为 ResourceType,其实和我们平时用的 T,K,V 这种一样,只不过这种更明显知道用意(这点是我们写泛型方法,泛型类的时候可以借鉴的)。

protected RequestBuilder(Glide glide, RequestManager requestManager, Class<TranscodeType> transcodeClass, Context context) {
    this.glide = glide;
    this.requestManager = requestManager;
    this.transcodeClass = transcodeClass;
    this.context = context;
    this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);
    this.glideContext = glide.getGlideContext();

    initRequestListeners(requestManager.getDefaultRequestListeners());
    apply(requestManager.getDefaultRequestOptions());
}

逐行看下,

glide 就是 Glide 对象,requestManager 就是 RequestManager 对象。

transcodeClass 这里就以 Drawable.class 类对象为例,对应的 TranscodeType 就是这个泛型类定义的泛型。

context 就是 Activity 对象。这里要区分一下 Glide 对象里也有 context 属性,它是通过 getApplicationContext 方法获取的,RequestManager 对象里的 context 属性是 Activity 类型,所以这里的 context 就是 Activity 类型。

transitionOptions 是通过 RequestManager 对象获取到的一个默认形变选项?经过简单的层层分析,这个来源是通过 GlideBuilder 进行配置的,在默认情况下这会是初始化对象。

glideContext 定义为 Glide 的全局上下文,继承自 ContextWrapper,看这内容还挺多,这里知道它比较重要就行。

initRequestListeners 方法要做的事情同 transitionOptions,默认情况下也是一个初始化对象。

最后一行代码的调用是为了配置 RequestOptions,这个值依然是通过 RequestManager,在 GlideContext 里是通过工厂方法创建返回给 RequestManager 对象的,而这个工厂对象的实现是在 Glide 对象的创建过程中赋值的,因为是 Builder 模式,在没有配置的情况下,可以看下 GlideBuilder 里有没有默认初始值,果然在 GlideBuilder 里有默认的实现,

private RequestOptionsFactory defaultRequestOptionsFactory =
    new RequestOptionsFactory() {
      @NonNull
      @Override
      public RequestOptions build() {
        return new RequestOptions();
      }
};

这样一来,RequestBuilder<Drawable> 对象就有了,同 GlideApp, Glide 的关系一样,RequestBuilder 和 GlideRequest 也是这么一对。

所以 load 方法就最终返回了 GlideRequest<Drawable> 对象。

对比 Picasso,Glide 的这两个方法调用逻辑和 Picasso 大体上有些类似。

//获取到了 Picasso 对象
Picasso.get();
//Picasso 对象调用获取到 RequestCreator
Picasso.load(url);

//创建 Glide 对象,并获取到了 RequestManager(GlideRequests) 对象
GlideApp.with();
//GlideRequests(RequestManager) 对象调用获取到 GlideRequest
GlideRequests.load();

图片请求加载过程可以认为有这么几步,1. 创建外观类(Picasso, Glide 类)对象,2. 创建请求管理者,3. 创建请求并发起请求,4. 处理结果。对比 Picasso 和 Glide,虽然类似,但还是有区别,总体来看,Picasso 的前两步更像是 Glide 的第一步,即 创建请求管理者,Picasso 的第三步会创建请求并发起,而 Glide 则将创建请求和发起请求做了拆分,创建请求 对应着 Glide 的第二步。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容