Glide原始碼學習-三大快取
文章目錄
- Glide原始碼學習-三大快取
- Lru演算法
- 一、Glide執行流程
- 二、三大快取
- 1.活動快取
- 2.記憶體快取
- 3.磁盤快取
- 圖片加載流程(三級快取):
Lru演算法
Lru演算法基于linkedHashmap,有一個最大長度值,如果添加元素的已經元素已經滿了,就會把最不常使用的元素移除,里面的元素只要使用過,就會放到最近的位置,方便呼叫,
Gilde框架中,記憶體快取和磁盤快取都是使用的Lru演算法
LinkedHashMap<String,Integer> map = new LinkedHashMap<>(0,0.75f,true);
map.put("one",1);
map.put("two",2);
map.put("three",3);
map.put("four",4);
map.put("five",5);
for (Map.Entry<String,Integer> entry :map.entrySet()){
System.out.println(entry.getValue()); // 1 2 3 4 5
}
map.get("three");
for (Map.Entry<String,Integer> entry :map.entrySet()){
System.out.println(entry.getValue()); // 1 2 4 5 3
}
一、Glide執行流程
1.給每一個RequestManager系結一個空白的Fragment來管理生命周期
2.Request物件的構建(請求的寬 高 采樣等各種配置)
3.請求之前,先檢測快取—Engine快取機制的檢測:先檢測活動快取ActiveResources有沒有,在檢測記憶體快取LruResourceCache有沒有,如果有,就會直接回呼,去加載
4.如果上面兩個快取都沒有找到,就會在EngineJob構建一個新的異步任務,執行Request之前,會先檢測DiskCache中有沒有本地磁盤快取
5.如果沒有磁盤快取,就通過網路請求,回傳輸入流InputStream,決議輸入流進行采樣壓縮,最終拿到bitmap
6.把bitmap轉換成Drawable,然后構建磁盤快取,構建記憶體快取ActiveResources
7.最后回到ImageViewTarget ,調取它的子類DrawableImageViewTarget顯示圖片,
二、三大快取

1.活動快取
1.圖片資源在活動快取和記憶體快取中只會存在一個,不會共存
2.存在的目的就是為了及時釋放記憶體,減少記憶體開銷,
3.創建Hashmap時,添加了一個弱參考,并且監聽,如果活動快取被移除了,就加入到記憶體快取中
2.記憶體快取
1.使用 Lru演算法,繼承自 LruCache<String, Value>, 重寫sizeOf(),entryRemoved()方法監聽元素被移除
2.如果頻繁加載圖片,例如瀑布流,串列之類的,會使用BitmapPool復用池(LruBitmapPool 這個類),作用是復用Bitmap地址,避免頻繁呼叫記憶體空間,防止記憶體抖動、記憶體碎片
3.磁盤快取
1.磁盤快取是從網路上請求圖片的時候構建的,
2.使用JakeWharton開源專案DiskLruCache進行資料的保存和讀取 https://github.com/JakeWharton/DiskLruCache
3.效率高的原因是DiskLruCache這個庫針對圖片保存做了優化,進行了加密和壓縮處理
圖片加載流程(三級快取):
1.去加載一個url地址,優先會去從活動快取中加載,
2.如果活動快取中沒有,則會去記憶體快取中查找,
3.記憶體快取也沒有,則會去從磁盤快取讀取
1)如果磁盤快取有這個圖片,就去讀取到活動快取中,并加載
2)如果磁盤緩存中沒有這個圖片,則會去請求網路下載圖片到本地,并讀取一份到活動快取,并加載出來
4.如果當前頁面關閉,活動快取資源就會保存一份到記憶體快取中,活動快取資料銷毀
5.跳到別的頁面,如果有相同資源的檔案,就會從記憶體快取中加載這個資源檔案,并且讀取到活動快取中,記憶體快取移除這個資源檔案
與傳統的三級快取相比,其實Glide相當于是四級快取,區別就是傳統三級快取只有記憶體快取,而Glide是把記憶體分成了活動快取和記憶體快取兩種,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292071.html
標籤:其他
上一篇:axios攔截器 @令狐張豪
