Glide 圖片加載庫源碼分析2-with 方法獲取圖片加載請求管理器

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

前面說到,getRetriever() 方法返回了 RequestManagerRetriever 對象亥啦,這次來看看 get 方法怎么獲取 RequestManager。

get() 實(shí)現(xiàn)了重載弃锐,根據(jù)入?yún)㈩愋筒煌譃?FragmentActivity, Activity, Fragment 等瑰排,

public RequestManager get(@NonNull FragmentActivity activity) {
    if (Util.isOnBackgroundThread()) {
        return get(activity.getApplicationContext());
    } else {
        assertNotDestroyed(activity);
        frameWaiter.registerSelf(activity);
        FragmentManager fm = activity.getSupportFragmentManager();
        return supportFragmentGet(activity, fm, null, isActivityVisible(activity));
    }
}

假設(shè)我們是在 Activity 上發(fā)起的圖片加載捉貌,那么會(huì)觸發(fā)這個(gè)方法的調(diào)用支鸡。首先會(huì)對當(dāng)前線程做區(qū)分,非主線程會(huì)采用 ApplicationContext 作為入?yún)⒊们裕绻侵骶€程就會(huì)利用 FragmentManager牧挣,

private RequestManager supportFragmentGet(Context context, FragmentManager fm, Fragment parentHint, boolean isParentVisible) {
    SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm, parentHint);
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
        Glide glide = Glide.get(context);
        requestManager = factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
        current.setRequestManager(requestManager);
    }
    return requestManager;
}

為啥會(huì)用到 FragmentManager,原來 Glide 定義了一個(gè) SupportRequestManagerFragment 用來存儲(chǔ) RequestManager醒陆,這個(gè) Fragment 我覺得可以不用理解為我們平時(shí)用的 Fragment瀑构,而更像是僅用作一個(gè)生命周期管理的載體,跟頁面展示無關(guān)刨摩。

所以頁面不同使得 FragmentManager 不同寺晌,F(xiàn)ragmentManager 不同使得 Fragment 不同世吨,進(jìn)而使得 RequestManager 不同。這么說來 RequestManager 就跟 Activity 相關(guān)了呻征,如果多個(gè) Fragment 用同一個(gè) FragmentManager耘婚,那么就持有同一個(gè) RequestManager 對象

一開始陆赋,這個(gè) Fragment 里肯定沒有 RequestManager 對象沐祷,要去創(chuàng)建,創(chuàng)建它的工廠對象在創(chuàng)建 RequestManagerRetriever 對象時(shí)賦值攒岛,但實(shí)際的來源是在 GlideBuilder 的配置上赖临,

private static void initializeGlide(/**省略**/) {
    RequestManagerRetriever.RequestManagerFactory factory = annotationGeneratedModule != null ? annotationGeneratedModule.getRequestManagerFactory() : null;
    builder.setRequestManagerFactory(factory);
}

但這其實(shí)也有條件,如果我們開發(fā)者沒有去利用注解配置灾锯,那就是 null, 可見還有地方?jīng)]分析到兢榨,

public RequestManagerRetriever(RequestManagerFactory factory, GlideExperiments experiments) {
    this.factory = factory != null ? factory : DEFAULT_FACTORY;
    //省略部分代碼......
}
private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
    @Override
    public RequestManager build(Glide glide, Lifecycle lifecycle, RequestManagerTreeNode requestManagerTreeNode, Context context) {
        return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
    }
}

順著思路再看就會(huì)發(fā)現(xiàn),RequestManagerRetriever 的構(gòu)造方法做了保證挠进,默認(rèn)返回了一個(gè) RequestManager 對象色乾。

最后會(huì)和 Fragment 做一個(gè)關(guān)聯(lián),并將這個(gè) RequestManager 對象返回领突。如果下次還是同一個(gè) Activity暖璧,那就不會(huì)再新創(chuàng)建了,而是之前返回君旦。

至此澎办,with 方法算是看的差不多了,也了解了一些相關(guān)概念金砍,隨著后面方法的梳理局蚀,再慢慢將這個(gè)孤立的概念關(guān)聯(lián)起來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恕稠,一起剝皮案震驚了整個(gè)濱河市琅绅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹅巍,老刑警劉巖千扶,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骆捧,居然都是意外死亡澎羞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門敛苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妆绞,“玉大人,你說我怎么就攤上這事±ㄈ模” “怎么了株茶?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷帝。 經(jīng)常有香客問我忌卤,道長,這世上最難降的妖魔是什么楞泼? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任驰徊,我火速辦了婚禮,結(jié)果婚禮上堕阔,老公的妹妹穿的比我還像新娘棍厂。我一直安慰自己,他們只是感情好超陆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布牺弹。 她就那樣靜靜地躺著,像睡著了一般时呀。 火紅的嫁衣襯著肌膚如雪张漂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天谨娜,我揣著相機(jī)與錄音航攒,去河邊找鬼。 笑死趴梢,一個(gè)胖子當(dāng)著我的面吹牛漠畜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坞靶,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憔狞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彰阴?” 一聲冷哼從身側(cè)響起也糊,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤肄满,失蹤者是張志新(化名)和其女友劉穎涧团,沒想到半個(gè)月后缠黍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妻味,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欣福。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责球。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雏逾,到底是詐尸還是另有隱情嘉裤,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布栖博,位于F島的核電站屑宠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仇让。R本人自食惡果不足惜典奉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧叽。 院中可真熱鬧卫玖,春花似錦、人聲如沸踊淳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迂尝。三九已至脱茉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垄开,已是汗流浹背琴许。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留说榆,地道東北人虚吟。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像签财,于是被迫代替她去往敵國和親串慰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 基于 Gilde 4.3.1 Glide 的使用參考文檔 Glide 使用起來特別方便唱蒸,一條鏈?zhǔn)秸{(diào)用就可以把圖片下...
    看我眼前007閱讀 26,852評(píng)論 11 70
  • 從Glide圖片加載流程深入分析源碼 不知道有沒有小伙伴跟我一樣邦鲫,使用Glide已經(jīng)有好多年,平時(shí)看源碼比較零碎神汹,...
    ijerocn閱讀 817評(píng)論 0 2
  • 在上篇Glide文章中庆捺,我們介紹了Glide圖片加載框架的使用,通過之前的學(xué)習(xí)屁魏,我們可能已經(jīng)能熟練的將Glide圖...
    Code4Android閱讀 11,655評(píng)論 2 38
  • 表情是什么滔以,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息氓拼。高興了當(dāng)然就笑了你画,難過就哭了抵碟。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,976評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)坏匪,但是人生放棄了冒險(xiǎn)拟逮,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,046評(píng)論 0 4