Glide 圖片加載庫源碼分析3-load 方法創(chuàng)建加載請求

先說前面分析的 Glide 的 with 方法蕾额,返回的是 RequestManager 對象,但實際上經(jīng)過 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);
}

通過調(diào)用父類的方法苔严,將返回結果轉型為 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);
}

調(diào)用 asDrawable 方法來獲取一個 RequestBuilder 對象孤澎,RequestBuilder 是個泛型類届氢,支持多種資源類型,例如 File, Bitmap, Gif亥至,在這里是通過 as-xxx 方法表現(xiàn)的悼沈,但最終都會通過 as 這個泛型方法來實現(xiàn)。

這個泛型方法的泛型命名為 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 對象。這里要區(qū)分一下 Glide 對象里也有 context 屬性酪耳,它是通過 getApplicationContext 方法獲取的浓恳,RequestManager 對象里的 context 屬性是 Activity 類型,所以這里的 context 就是 Activity 類型碗暗。

transitionOptions 是通過 RequestManager 對象獲取到的一個默認形變選項颈将?經(jīng)過簡單的層層分析,這個來源是通過 GlideBuilder 進行配置的言疗,在默認情況下這會是初始化對象晴圾。

glideContext 定義為 Glide 的全局上下文,繼承自 ContextWrapper噪奄,看這內(nèi)容還挺多死姚,這里知道它比較重要就行。

initRequestListeners 方法要做的事情同 transitionOptions勤篮,默認情況下也是一個初始化對象知允。

最后一行代碼的調(diào)用是為了配置 RequestOptions,這個值依然是通過 RequestManager叙谨,在 GlideContext 里是通過工廠方法創(chuàng)建返回給 RequestManager 對象的,而這個工廠對象的實現(xiàn)是在 Glide 對象的創(chuàng)建過程中賦值的保屯,因為是 Builder 模式手负,在沒有配置的情況下涤垫,可以看下 GlideBuilder 里有沒有默認初始值,果然在 GlideBuilder 里有默認的實現(xiàn)竟终,

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

這樣一來蝠猬,RequestBuilder<Drawable> 對象就有了,同 GlideApp, Glide 的關系一樣统捶,RequestBuilder 和 GlideRequest 也是這么一對榆芦。

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

對比 Picasso喘鸟,Glide 的這兩個方法調(diào)用邏輯和 Picasso 大體上有些類似匆绣。

//獲取到了 Picasso 對象
Picasso.get();
//Picasso 對象調(diào)用獲取到 RequestCreator
Picasso.load(url);

//創(chuàng)建 Glide 對象,并獲取到了 RequestManager(GlideRequests) 對象
GlideApp.with();
//GlideRequests(RequestManager) 對象調(diào)用獲取到 GlideRequest
GlideRequests.load();

圖片請求加載過程可以認為有這么幾步什黑,1. 創(chuàng)建外觀類(Picasso, Glide 類)對象崎淳,2. 創(chuàng)建請求管理者,3. 創(chuàng)建請求并發(fā)起請求愕把,4. 處理結果拣凹。對比 Picasso 和 Glide,雖然類似恨豁,但還是有區(qū)別嚣镜,總體來看,Picasso 的前兩步更像是 Glide 的第一步橘蜜,即 創(chuàng)建請求管理者菊匿,Picasso 的第三步會創(chuàng)建請求并發(fā)起,而 Glide 則將創(chuàng)建請求和發(fā)起請求做了拆分扮匠,創(chuàng)建請求 對應著 Glide 的第二步捧请。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棒搜,隨后出現(xiàn)的幾起案子疹蛉,更是在濱河造成了極大的恐慌,老刑警劉巖力麸,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可款,死亡現(xiàn)場離奇詭異,居然都是意外死亡克蚂,警方通過查閱死者的電腦和手機闺鲸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃叭,“玉大人摸恍,你說我怎么就攤上這事。” “怎么了立镶?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵壁袄,是天一觀的道長。 經(jīng)常有香客問我媚媒,道長嗜逻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任缭召,我火速辦了婚禮栈顷,結果婚禮上,老公的妹妹穿的比我還像新娘嵌巷。我一直安慰自己萄凤,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布晴竞。 她就那樣靜靜地躺著蛙卤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪噩死。 梳的紋絲不亂的頭發(fā)上颤难,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音已维,去河邊找鬼行嗤。 笑死,一個胖子當著我的面吹牛垛耳,可吹牛的內(nèi)容都是我干的栅屏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堂鲜,長吁一口氣:“原來是場噩夢啊……” “哼栈雳!你這毒婦竟也來了?” 一聲冷哼從身側響起缔莲,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哥纫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痴奏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛀骇,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年读拆,在試婚紗的時候發(fā)現(xiàn)自己被綠了擅憔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡檐晕,死狀恐怖暑诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤个榕,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布啦逆,位于F島的核電站,受9級特大地震影響笛洛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乃坤,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一苛让、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湿诊,春花似錦狱杰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朗和,卻和暖如春错沽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眶拉。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工千埃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忆植。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓放可,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朝刊。 傳聞我的和親對象是個殘疾皇子耀里,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容