當前位置:首頁 » 文件管理 » glide緩存位置

glide緩存位置

發布時間: 2023-08-21 03:16:04

❶ Android 【手撕Glide】--Glide緩存機制(面試)

本文源碼解析基於Glide 4.6.1

系列文章
Android 【手撕Glide】--Glide緩存機制
Android 【手撕Glide】--Glide緩存機制(面試)
Android 【手撕Glide】--Glide是如何關聯生命周期的?

Glide緩存分為內存緩存和磁碟緩存,其中內存緩存是由弱引用+LruCache組成。

取的順序是:弱引用、LruCache、磁碟
存的順序是:磁碟、弱引用、LruCache

這張親手製作的圖片,方便大家更直觀的理解緩存機制的整體流程,結合文末總結效果更佳。喜歡的記得點贊!

概述

1、弱引用是由這樣一個HashMap維護,key是緩存的key,這個key由圖片url、width、height等10來個參數組成;value是圖片資源對象的弱引用形式。

2、LruCache是由一個LinkedHashMap維護,根據Lru演算法來管理圖片。大致的原理是利用linkHashMap鏈表的特性,把最近使用過的文件插入到列表頭部,沒使用的圖片放在尾部;然後當圖片大小到達預先設置的一個閥值的時候 ,按演算法刪除列表尾部的部分數據。由於篇幅有限,這里不講解LruCache和DiskLruCache的底層原理,這里推薦一篇 圖解LinkedHashMap原理

這是Glide自定義的LruCache

存取原理
取數據
在內存緩存中有一個概念叫圖片引用計數器 ,具體來說是在 EngineResource 中定義一個 acquired 變數用來記錄圖襪指正片被引用的次數,調用 acquire() 方法會讓變數加1,調用 release() 方法會讓變數減1。

獲取圖片資源是先從弱引用取緩存,拿到的話,引用計數+1;沒有的話從LruCache中拿緩存,拿到的話,引用計數逗枝也是+1,同時把圖片從LruCache緩存轉移到弱應用緩存池中;再沒有的話就通過 EngineJob 開啟線程池去載入圖片,拿到的話,引用計數也是+1,會把圖片放到弱引用。

存數據
很明顯,這是載入圖片之後的事情。通過 EngineJob 開啟線程池去載入圖片,取到數據之後,會回調到主線程,把圖片存到弱引用。當圖片不再使用的時候,比如說暫停請求或者載入完畢或者清除資源時,就會將其從弱引用中轉移到告悔 LruCache 緩存池中。 總結一下,就是正在使用中的圖片使用 弱引用 來進行緩存,暫時不用的圖片使用 LruCache 來進行緩存的功能;同一張圖片只會出現在 弱引用 和 LruCache 中的一個。

為什麼要引入軟引用?
1、分壓策略,減少Lrucache 中 trimToSize 的概率。如果正在remove的是張大圖,lrucache正好處在臨界點,此時remove操作,將延緩Lrucache的 trimToSize 操作;
2 提高效率:弱引用用的是 HashMap ,Lrucache用的是 LinkedHashMap ,從訪問效率而言,肯定是 HashMap 更高。

Glide磁碟緩存策略(4.x)

如果在內存緩存中沒獲取到數據會通過 EngineJob 開啟線程池去載入圖片,這里有2個關鍵類: DecodeJob 和 EngineJob 。 EngineJob 內部維護了線程池,用來管理資源載入,當資源載入完畢的時候通知回調; DecodeJob 是線程池中的一個任務。

磁碟緩存是通過 DiskLruCache 來管理的,根據緩存策略,會有2種類型的圖片, DATA (原始圖片)和 RESOURCE (轉換後的圖片)。磁碟緩存依次通過 ResourcesCacheGenerator 、 SourceGenerator 、 DataCacheGenerator 來獲取緩存數據。 ResourcesCacheGenerator 獲取的是轉換過的緩存數據; SourceGenerator 獲取的是未經轉換的原始的緩存數據; DataCacheGenerator 是通過網路獲取圖片數據再按照按照緩存策略的不同去緩存不同的圖片到磁碟上。

Glide緩存分為 弱引用+ LruCache+ DiskLruCache ,其中讀取數據的順序是:弱引用 > LruCache > DiskLruCache>網路;寫入緩存的順序是:網路 --> DiskLruCache--> LruCache-->弱引用

內存緩存分為弱引用的和 LruCache ,其中正在使用的圖片使用弱引用緩存,暫時不使用的圖片用 LruCache緩存,這一點是通過 圖片引用計數器(acquired變數)來實現的,詳情可以看內存緩存的小結。

磁碟緩存就是通過DiskLruCache實現的,根據緩存策略的不同會獲取到不同類型的緩存圖片。它的邏輯是:先從轉換後的緩存中取;沒有的話再從原始的(沒有轉換過的)緩存中拿數據;再沒有的話就從網路載入圖片數據,獲取到數據之後,再依次緩存到磁碟和弱引用。

參考:
面試官:簡歷上最好不要寫Glide,不是問源碼那麼簡單
原來面試的時候寫精通Glide,這樣問我這樣答

❷ Glide圖片載入的用法介紹和三級緩存實現

Glide庫是用來實現圖片載入的框架,功能強大且易使用,深受大家喜愛。

為啥要做緩存? android默認給每個應用只分配16M的內存,所以如果載入過多的圖片,為了 防止內存溢出 ,應該將圖片緩存起來。

圖片的三級緩存分別是:

1、內存緩存
2、本地緩存
3、網路緩存
其中,內存緩存應優先載入,它速度最快;本地緩存次優先載入,它速度也快;網路緩存不應該優先載入,它走網路,速度慢且耗流量。

最優-優先順序:內存緩存 > 本地緩存 > 網路緩存

兩個方法實現:根據圖片的url去載入圖片、在本地和內存中緩存

兩個方法實現:設置本地緩存,以及獲取本地緩存

兩個方法實現:設置內存緩存,獲取內存緩存。

如果使用hashmap去存儲圖片時,當圖片越來越多,那麼會造成內存溢出,因為是強引用(對於強引用的系統不會回收)

如果改成軟引用softReference,在android 2.3 以上的系統,對象會被提前回收。

可以用LruCache來解決上述內存不回收或提前回收的問題。least recentlly use 最少最近使用演算法 它會將內存控制在一定的大小內, 超出最大值時會自動回收, 這個最大值開發者自己定。(這個東西沒有用過..)

參考鏈接: https://blog.csdn.net/sinat_20645961/article/details/46325243

❸ android glide 清理緩存方法,怎麼清理緩存

很多人不知道安卓手機怎麼清理緩存?很多長輩遇到手機內存不足的時候各種束手無策,下面小編就來教一下大家android清除程序緩存的方法,希望對大家有幫助

安卓手機怎麼清理緩存 android清除程序緩存的方法
一,系統清除
1、在你手機中「設置->應用程序 >管理應用程序」
2、然後按Menu鍵「按大小排序」選項 這時會有你手機中所用應用程序
3、選擇要清除緩存的軟體,就會出現「清除緩存」選項,點擊清除緩存這樣就會把清除緩存文件占據的空間是放出來。
二、利用RE管理器

軟體名稱:
RE管理器中文版 for android v3.1.7 漢化版 安卓版
軟體大小:
1.99MB
更新時間:
2014-03-09

首先手機要獲取過ROOT高級許可權
然後安裝了RE管理器。
下面就准備開始清理你的手機了
1.打開RE管理器。
2.打開data / dalivik-cahce
3.把dalivik-cache裡面的文件全部都刪掉,不要猶豫。沒錯裡面的文件是可以全部刪除的。
4.重啟手機,重啟的過程中可能會比較慢就像你刷完機後第一次開機一樣。
三、其它方法介紹
利用第三方法工具,如有安卓優化大師、ET優化大師、手機優化大師這三款手機優化軟體在常規的開機加速、進程管理、程序管理、安裝卸載、系統優化清理等常規功能表現都是不錯的。
特色功能
安卓優化大師偏向於節電優化、工具箱應用功能拓展;
ET優化大師注重電量管理的同時,也重視快速省電開關的應用;
手機優化大師則具有更靈活的功能插件應用,用戶可根據需要下載使用文件管理、桌面管理、系統備份、書簽管理等功能。

❹ Glide ② — 緩存機制

閱讀本文需要先了解 Glide載入流程

首先介紹一下Glide中對圖片資源的封裝類: EngineResource

在活動緩存中,使用了一個map用來存放EngineResource對象,這里需要注意一個操作,就是這個EngineResource對象是用WeakReference包裹的,並且通過ReferenceQueue監聽了EngineResource的回收,在回收的時候會清理當前的活動緩存內容;
下面分析一下源碼是如果實現的:
首先,自定義一個WeakReference類,將key和resource傳進入(用於在WeakReference回收的時候釋放),傳入一個ReferenceQueue對象,用於監聽WeakReference回收

開啟一個子線程,在循環中監聽ReferenceQueue的返回值,通過這個返回值,判斷WeakReference有沒有回收,監聽的方法是ReferenceQueue.remove(),這是一個阻塞方法;所以要開子線程;

LruResourceCache繼承了LruCache類,關於LruCache類,簡單提一下,具體的可以參考我之前的博客 LruCache實現 ,LruCache繼承了LinkedHashMap,LinkedHashMap有一個特點,就get後的數據會移動到隊列,這就是Lru思想:固定一個容量,put的時候如果超過容量了,將最後一個節點刪除,get的時候將get的這個節點移動到隊列的頭部;

onItemEvicted()方法是LruCache的一個空方法,調用的時機是在put的時候判斷是否超過容量,如果超過容量了,就淘汰最後一個節點,並調用這個方法;

活動緩存和內存緩存都是緩存在內存中的,活動緩存緩存的是正在使用的圖片資源,當圖片不使用時會放到內存緩存中,提出活動緩存的目的:單一的內存緩存由於Lru的淘汰機制會導致圖片載入不穩定

首先介紹一個磁碟緩存方案DiskLruCache(非Google官方編寫,但獲得官方認證),關於這個磁碟緩存方案的理解可以看郭林的這片文章:
Android DiskLruCache完全解析,硬碟緩存的最佳方案

從上一篇文章知道,Glide載入操作是通過 Engine 來驅動的

Engine的load()中,首先嘗試從 活動緩存 和 內存緩存 獲取緩存,如果沒有緩存再啟動EngineJob和DecodeJob; 上面介紹了緩存的獲取,下面看一下緩存的存放,肯定是在獲取到圖片後的回調中存放的

在DecodeJob獲取到圖片數據後,會回調很多介面,在回調中會將其放入 活動緩存 ,當圖片不在使用的時候,就會放入內存緩存,根據上面介紹的活動緩存規則,當 EngineResource 計數為0時就應該放入內存緩存;

當資源引用為0,回調onResourceReleased(),從活動緩存移除,放入內存緩存;

上面介紹了活動緩存和內存緩存的存放和獲取,下面看一看磁碟緩存的存取;

還記得 DataFetcherGenerator 介面嗎?這個介面是DecodeJob用於獲取數據的,有三個具體的實現:

我們在上一篇具體介紹的是網路文件的獲取,這里的磁碟緩存使用的就是 DataCacheGenerator(緩存文件) 這個Generator了

上篇文章知道DecodeJob是一個Runnable任務,在run()會調用runWrapped(),在runWrapped()中會做三種事情:

在runWrapped()的解碼操作中會執行decode(),在decode()中,會disk put操作;

Glide的磁碟緩存是基於DiskLruCache 實現的,Glide直接使用的是DiskLruCacheWrapper對象對DiskLruCache 的封裝;

熱點內容
閑魚和安卓哪個賺錢 發布:2025-05-17 21:15:56 瀏覽:583
c語言一個c源程序 發布:2025-05-17 21:11:44 瀏覽:314
如何加密手機的文件 發布:2025-05-17 21:11:43 瀏覽:915
ios開發文件上傳 發布:2025-05-17 21:10:40 瀏覽:983
g92編程 發布:2025-05-17 21:00:31 瀏覽:170
匯編語言第三版腳本之家 發布:2025-05-17 20:54:26 瀏覽:399
資源配置最佳狀態叫什麼 發布:2025-05-17 20:48:58 瀏覽:84
定義dns伺服器的ip 發布:2025-05-17 20:32:37 瀏覽:954
android判斷圖片 發布:2025-05-17 20:32:33 瀏覽:833
安卓12什麼時候適配小米 發布:2025-05-17 20:31:47 瀏覽:71