對于Glide源碼分析温算,基本已經(jīng)接近尾聲怜校,整體下來,整個Glide工程代碼量還是比較大的注竿,涉及的知識點以及設計模式也很多茄茁,很值得研究一下,這里我貼上github源碼中巩割,關于glide工程的一張簡單的引用關系裙顽。如下:
這樣大家面對這個強大的代碼庫也就不那么不知所措了,最核心的也就是library庫宣谈,glide相關的絕大多數(shù)都是在這個里面的愈犹。上層不過是一些簡單的擴展,比如volley與okhttp3等闻丑。為了方便大家自己研讀源碼漩怎,我這里給出我在研究的時候一些簡要的思路。
- 整個glide庫運行時嗦嗡,會構建一個單例對象glide勋锤,它里面負責注冊一系列的ModelLoaders和對應的ModelFetchers以及一大堆的Encoder與Decoder對象。其中ModelLoaders與ModelFetchers負責從數(shù)據(jù)源加載數(shù)據(jù)侥祭,遠端或本地DickCacke叁执;Encoder負責將數(shù)據(jù)保存至本地文件,Decoder則是一個反向的操作卑硫,負責從本地解碼數(shù)據(jù)徒恋。
- 整個運行中,只會存在一個Engine實例欢伏,一個ActiveResources入挣,一個MemoryCache,若干個RequestManager硝拧,若干個Target與Request径筏,一個Request中會持有一個其加載到的Resource葛假。RequestManager與Target是與生命周期綁定的,在RequestManager中會根據(jù)生命周期方法調(diào)度其所有的Request對象滋恬,讓它們?nèi)∠蛘咧匦录虞d聊训。
- Request這里我們重點分析的是SingleRequest,它里面加載成功會會持有一個EngineResource資源恢氯,EngineResource內(nèi)部是一個引用計數(shù)带斑,當計數(shù)減到0時,等待某個時機勋拟,Request被clear的時候勋磕,會將EngineResource資源從ActiveResources移動至MemoryCache,可以簡單理解為一個二級緩存策略敢靡,有效提高命中率以及防止過多的操作MemoryCache造成內(nèi)存抖動挂滓。
- 每一次圖片加載,不論是緩存命中啸胧,亦或是遠端加載得到的赶站,均會創(chuàng)建一個Request對象,同時添加至RequestManager中被管理起來并進行調(diào)度纺念,使之也擁有生命周期贝椿。
- MemoryCache一般是用在于多個頁面之間,這里以Activity為單位柠辞,比如A頁面被銷毀团秽,則A中對應的RequestManager中加載的資源會從ActiveResources移動至MemoryCache,這個時候再進入B頁面的時候叭首,如果此時B頁面也加載相同的資源习勤,那么此時MemoryCache會被命中,同時又會將資源從MemoryCache移動至ActiveResources焙格。
- glide一次加載大致是load創(chuàng)建一個RequestBuilder對象图毕,而后通過Builder對象可以設置大量的參數(shù)信息,最后是調(diào)用into創(chuàng)建相應的Target以及Request對象眷唉,最終調(diào)用Engine模塊啟動加載予颤。
- Glide在加載成功之后,在onResourceDecoded中會對decode過的資源冬阳,再做一次transform蛤虐,我們設置的一些屬性比如CENTER_CROP、FIT_CENTER變換等肝陪,會在這里進行轉換驳庭,最終通過Target渲染到對應的View上面。
- 源碼中涉及到的很多主要的類,需要仔細研究饲常,比如Target蹲堂、Resource、ModelLoader贝淤、DataFetcher柒竞、ResourceDecoder、Encoder播聪、Key等朽基,宏觀上先理解它們的用處,而后就更容易理解代碼的微觀過程了离陶,需要很有耐心的研究踩晶。
"Reading the fuck source code!"整個Glide源碼相對非常復雜,我們也沒有必要對每一處細節(jié)都掌握的清清楚楚枕磁,關鍵是理解別人設計的思想,可能光看這些文檔术吝,顯然是無法理解代碼中的正在奧妙之處的计济,這里我也只是列出了我在分析過程中的一些體會和要點,也僅僅只是給大家一個參考排苍。紙上來得終覺淺沦寂,如果想深入一個模塊,還是必須得親自實踐淘衙,不斷的看代碼Debug传藏,不斷的閱讀源碼,從源碼從找到答案彤守,解決自己的疑惑毯侦,借鑒別人的優(yōu)秀設計,這樣自己才能進步具垫。講了很多源碼性的東西侈离,Glide提供的自定義擴展模塊也是相當?shù)撵`活,包括替換成自己的loader筝蚕,換網(wǎng)絡加載庫等卦碾。最后我會分析Glide一些比較實用的地方,在源碼的基礎上做一些實踐起宽。