1: RequestManager with = Glide.with(this);
RequestBuilder<Drawable> load = with.load(url);
load.into(iv);
第一條 搞清楚這個請求發送到哪里去了,
RequestTracker 兩個隊列 一個requests pendingRequests 請求過來之后,都是存入這兩個隊列;
從Glide具有生命周期的特性開始推算:
RequestManager在進行維護隊列;
問題:不知道誰去維護?
誰在處理;
第二條線:為什么RequestManager能夠管理生命周期?
通過RequestMangerRetriever創建一個無UI的Fragment,并將這個Fragment的生命周期綁定到RequestManager上;
Glide生命周期怎么處理的?
為什么要有生命周期?
Glide隊列請求如何處理的?
1:當我們load.into(iv);方法時,所有的請求都會被添加到一個叫RequestTracker的隊列中,而且這個隊列有兩個
一個是運行時隊列,一個是等待隊列;
如果當前頁面停止,onStop方法被調用,所有的運行中的請求都會停止,并且全部添加到等待隊列中;
當開始運行時,又會把所有等待隊列中的請求 放到運行中去!
隊列是如何維護的?
RequestManager with = Glide.with(this);
通過這句代碼,創建了一個RequestManager,并且在Glide.with方法中,為傳入的this(Acitivity)創建一個無UI的Fragment,
并且將Fragment的生命周期綁定到RequestManager上,當Activity觸發了onstop等方法時,則會隱式的調用Fragment的onstop方法,再通過fragment的onstop調用RequestManager的onstop方法,以此來管理兩個請求隊列中的請求;
第三條主線
1:當RequestManager調用requestTracker.runRequest的時候,
2: 所有的請求都會構建成一個SingleRequest,并且開始調用begin方法運行;
3:begin方法最終會調用engine.load方法
4:根據request構建EngineKey
5:根據EngineKey去活動緩存中獲取數據
6:如果獲取不到,去內存緩存中獲取數據
7:如果獲取不到,通過硬盤緩存的線程池去獲取本地硬盤的數據
8:如果獲取不到本地的,通過網絡的線程池去獲取網絡的數據
Glide跟其他框架相比優勢在哪里?
1:生命周期得管理
2:支持gif picasso支持gif
3:三級緩存,內存緩存中還分為活動緩存和內存緩存;活動緩存指得是講正在使用得圖片用弱引用緩存,使用完成后到內存緩存;再到磁盤緩存;
4:占用內存小,它默認得編碼格式是rgb565; picasso用得argb8888 ImageLoader不支持gif圖片加載 而且也很老了
如何設計自己的圖片加載框架
1:Glide手寫資源封裝
// 2:活動緩存
// 3:內存緩存
// 4:磁盤緩存
// 5:生命周期
Glide源碼流程分析;
Glide生命周期怎么做到的?