Glide源碼分析(七),總綱思路梳理

對于Glide源碼分析温算,基本已經(jīng)接近尾聲怜校,整體下來,整個Glide工程代碼量還是比較大的注竿,涉及的知識點以及設計模式也很多茄茁,很值得研究一下,這里我貼上github源碼中巩割,關于glide工程的一張簡單的引用關系裙顽。如下:

glide.jpeg

這樣大家面對這個強大的代碼庫也就不那么不知所措了,最核心的也就是library庫宣谈,glide相關的絕大多數(shù)都是在這個里面的愈犹。上層不過是一些簡單的擴展,比如volley與okhttp3等闻丑。為了方便大家自己研讀源碼漩怎,我這里給出我在研究的時候一些簡要的思路。

  1. 整個glide庫運行時嗦嗡,會構建一個單例對象glide勋锤,它里面負責注冊一系列的ModelLoaders和對應的ModelFetchers以及一大堆的Encoder與Decoder對象。其中ModelLoaders與ModelFetchers負責從數(shù)據(jù)源加載數(shù)據(jù)侥祭,遠端或本地DickCacke叁执;Encoder負責將數(shù)據(jù)保存至本地文件,Decoder則是一個反向的操作卑硫,負責從本地解碼數(shù)據(jù)徒恋。
  2. 整個運行中,只會存在一個Engine實例欢伏,一個ActiveResources入挣,一個MemoryCache,若干個RequestManager硝拧,若干個Target與Request径筏,一個Request中會持有一個其加載到的Resource葛假。RequestManager與Target是與生命周期綁定的,在RequestManager中會根據(jù)生命周期方法調(diào)度其所有的Request對象滋恬,讓它們?nèi)∠蛘咧匦录虞d聊训。
  3. Request這里我們重點分析的是SingleRequest,它里面加載成功會會持有一個EngineResource資源恢氯,EngineResource內(nèi)部是一個引用計數(shù)带斑,當計數(shù)減到0時,等待某個時機勋拟,Request被clear的時候勋磕,會將EngineResource資源從ActiveResources移動至MemoryCache,可以簡單理解為一個二級緩存策略敢靡,有效提高命中率以及防止過多的操作MemoryCache造成內(nèi)存抖動挂滓。
  4. 每一次圖片加載,不論是緩存命中啸胧,亦或是遠端加載得到的赶站,均會創(chuàng)建一個Request對象,同時添加至RequestManager中被管理起來并進行調(diào)度纺念,使之也擁有生命周期贝椿。
  5. MemoryCache一般是用在于多個頁面之間,這里以Activity為單位柠辞,比如A頁面被銷毀团秽,則A中對應的RequestManager中加載的資源會從ActiveResources移動至MemoryCache,這個時候再進入B頁面的時候叭首,如果此時B頁面也加載相同的資源习勤,那么此時MemoryCache會被命中,同時又會將資源從MemoryCache移動至ActiveResources焙格。
  6. glide一次加載大致是load創(chuàng)建一個RequestBuilder對象图毕,而后通過Builder對象可以設置大量的參數(shù)信息,最后是調(diào)用into創(chuàng)建相應的Target以及Request對象眷唉,最終調(diào)用Engine模塊啟動加載予颤。
  7. Glide在加載成功之后,在onResourceDecoded中會對decode過的資源冬阳,再做一次transform蛤虐,我們設置的一些屬性比如CENTER_CROP、FIT_CENTER變換等肝陪,會在這里進行轉換驳庭,最終通過Target渲染到對應的View上面。
  8. 源碼中涉及到的很多主要的類,需要仔細研究饲常,比如Target蹲堂、Resource、ModelLoader贝淤、DataFetcher柒竞、ResourceDecoder、Encoder播聪、Key等朽基,宏觀上先理解它們的用處,而后就更容易理解代碼的微觀過程了离陶,需要很有耐心的研究踩晶。

"Reading the fuck source code!"整個Glide源碼相對非常復雜,我們也沒有必要對每一處細節(jié)都掌握的清清楚楚枕磁,關鍵是理解別人設計的思想,可能光看這些文檔术吝,顯然是無法理解代碼中的正在奧妙之處的计济,這里我也只是列出了我在分析過程中的一些體會和要點,也僅僅只是給大家一個參考排苍。紙上來得終覺淺沦寂,如果想深入一個模塊,還是必須得親自實踐淘衙,不斷的看代碼Debug传藏,不斷的閱讀源碼,從源碼從找到答案彤守,解決自己的疑惑毯侦,借鑒別人的優(yōu)秀設計,這樣自己才能進步具垫。講了很多源碼性的東西侈离,Glide提供的自定義擴展模塊也是相當?shù)撵`活,包括替換成自己的loader筝蚕,換網(wǎng)絡加載庫等卦碾。最后我會分析Glide一些比較實用的地方,在源碼的基礎上做一些實踐起宽。

下一篇 Glide源碼分析(八)洲胖,Glide的自定義模塊擴展與實踐

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坯沪,隨后出現(xiàn)的幾起案子绿映,更是在濱河造成了極大的恐慌,老刑警劉巖屏箍,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘梦,死亡現(xiàn)場離奇詭異橘忱,居然都是意外死亡,警方通過查閱死者的電腦和手機卸奉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門钝诚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榄棵,你說我怎么就攤上這事凝颇。” “怎么了疹鳄?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵拧略,是天一觀的道長。 經(jīng)常有香客問我瘪弓,道長垫蛆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任腺怯,我火速辦了婚禮袱饭,結果婚禮上,老公的妹妹穿的比我還像新娘呛占。我一直安慰自己虑乖,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布晾虑。 她就那樣靜靜地躺著疹味,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帜篇。 梳的紋絲不亂的頭發(fā)上糙捺,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音坠狡,去河邊找鬼继找。 笑死,一個胖子當著我的面吹牛逃沿,可吹牛的內(nèi)容都是我干的婴渡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼凯亮,長吁一口氣:“原來是場噩夢啊……” “哼边臼!你這毒婦竟也來了?” 一聲冷哼從身側響起假消,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤柠并,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼予,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鸣戴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粘拾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄锅。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缰雇,靈堂內(nèi)的尸體忽然破棺而出入偷,到底是詐尸還是另有隱情,我是刑警寧澤械哟,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布疏之,位于F島的核電站,受9級特大地震影響暇咆,放射性物質發(fā)生泄漏锋爪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一爸业、第九天 我趴在偏房一處隱蔽的房頂上張望几缭。 院中可真熱鬧,春花似錦沃呢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纸兔,卻和暖如春惰瓜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汉矿。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工崎坊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洲拇。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓奈揍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赋续。 傳聞我的和親對象是個殘疾皇子男翰,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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