Glide 重點
生命周期管理 和緩存
with
- 對于activity的:以onstart為例
- 會新建2個空白fragment(androidx的fragment;app的fragment),用于監(jiān)聽生命周期函數(shù)。
- 當監(jiān)聽到變化的時候,會調(diào)用ActivityFragmentLifeCycle(實現(xiàn)了LifeCycle)的onstart方法,這里是個集合,遍歷調(diào)用執(zhí)行onstart
- LifecycleListener 在RequestManager里面實現(xiàn)的,這里再去分發(fā)調(diào)用Glide里面的其他的xxtarget類
- 注意:其中fragment那里的創(chuàng)建 可以參考,用先存入集合再調(diào)用begintransaction comitallowingstateloss 來保證fragment不被重復(fù)創(chuàng)建,還用handler 移除集合 來保證不會重建,因為消息是在handler的等待隊列里面的,要handler來把他放到執(zhí)行隊列里面。
- 對于沒有界面的:
- 用的applicationcontext,和整個程序一樣的生命周期。
- with流程
- 空白fragment(app+androidx)-->ActivityFragmentLifecycle實現(xiàn)lifecycle-->LifecycleListener-->RequestManager實現(xiàn)LifecycleListener-->glide里面其余的 ImageViewTarget、DefaultConnectivity...
- ApplicationLifecycle 實現(xiàn)Lifecycle -->操作LifecycleListener
緩存分析
- 先調(diào)用活動緩存
當前界面顯示的都在活動緩存里面,生命周期的ondestory的時候 再把緩存數(shù)據(jù)全部放入LRU緩存 - 再調(diào)用內(nèi)存LRU緩存
需要用的時候會把數(shù)據(jù)放入活動緩存,刪掉LRU里面的對應(yīng)緩存 - 再調(diào)用本地LRU緩存 J 安卓之神寫的 DiskLRU緩存
參考的LRU緩存,需要的時候復(fù)制數(shù)據(jù)到活動緩存,不會刪掉本地的 - 再網(wǎng)上取或者drawable本地取
先存入本地LRU緩存,用的時候再走活動緩存
整體簡化主線流程 glide11 的url版本 主要into
Glide構(gòu)建
-->with:給每個RequestManager綁定一個空白fragment管理生命周期(分支:application無頁面)
-->into:Request對象的構(gòu)建:請求、寬、高、采樣...
-->請求之前 先檢測緩存
-->Engine緩存機制的檢測:先檢測活動緩存ActiveResources、再檢測內(nèi)存緩存LruResourceCache 如果命中任意一級緩存則回調(diào)直接顯示
-->沒有緩存,則在EnginJob構(gòu)建異步任務(wù)
-->xxtask:執(zhí)行Request之前,先檢測DiskCache本地磁盤緩存
-->如果沒有磁盤緩存,通過網(wǎng)絡(luò)請求,返回輸入流inputstream
-->解析輸入流,進行采樣壓縮,得到Bitmap;這里有很多跳轉(zhuǎn)中轉(zhuǎn)包裝的過程
-->Bitmap轉(zhuǎn)換為Drawable
-->構(gòu)建磁盤緩存DiskCache
-->構(gòu)建內(nèi)存緩存ActiveResource
-->回到ImageViewTarget 子類 DrawableImageViewTarget顯示圖片
看源碼思路
- 第一次看:先看下別的博客的流程,有個大概概念
- 第二次看:先走主線流程,埋下伏筆
接口的地方,一步步跳轉(zhuǎn)進去找到實現(xiàn)即可。 - 第三次看:重點主線流程,關(guān)注下支線
- 第四次看:如果主線清晰了,再分析支線,不清晰則繼續(xù)第四次....