Glide庫是用來實現(xiàn)圖片加載的框架,功能強大且易使用,深受大家喜愛。

創(chuàng)新互聯(lián)建站自2013年起,先為繁峙等服務(wù)建站,繁峙等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為繁峙企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
為啥要做緩存? android默認(rèn)給每個應(yīng)用只分配16M的內(nèi)存,所以如果加載過多的圖片,為了 防止內(nèi)存溢出 ,應(yīng)該將圖片緩存起來。
圖片的三級緩存分別是:
1、內(nèi)存緩存
2、本地緩存
3、網(wǎng)絡(luò)緩存
其中,內(nèi)存緩存應(yīng)優(yōu)先加載,它速度最快;本地緩存次優(yōu)先加載,它速度也快;網(wǎng)絡(luò)緩存不應(yīng)該優(yōu)先加載,它走網(wǎng)絡(luò),速度慢且耗流量。
最優(yōu)-優(yōu)先級:內(nèi)存緩存 本地緩存 網(wǎng)絡(luò)緩存
兩個方法實現(xiàn):根據(jù)圖片的url去加載圖片、在本地和內(nèi)存中緩存
兩個方法實現(xiàn):設(shè)置本地緩存,以及獲取本地緩存
兩個方法實現(xiàn):設(shè)置內(nèi)存緩存,獲取內(nèi)存緩存。
如果使用hashmap去存儲圖片時,當(dāng)圖片越來越多,那么會造成內(nèi)存溢出,因為是強引用(對于強引用的系統(tǒng)不會回收)
如果改成軟引用softReference,在android 2.3 以上的系統(tǒng),對象會被提前回收。
可以用LruCache來解決上述內(nèi)存不回收或提前回收的問題。least recentlly use 最少最近使用算法 它會將內(nèi)存控制在一定的大小內(nèi), 超出最大值時會自動回收, 這個最大值開發(fā)者自己定。(這個東西沒有用過..)
參考鏈接:
網(wǎng)絡(luò)加載,不優(yōu)先加載,速度慢,浪費流量
本地緩存,次優(yōu)先加載,速度快
內(nèi)存緩存,優(yōu)先加載,速度最快
首次加載Android App時,肯定要通過網(wǎng)絡(luò)交互來獲取圖片,之后我們可以將圖片保存至本地SD卡和內(nèi)存中,之后運行APP時,優(yōu)先訪問內(nèi)存中的圖片緩存,若內(nèi)存中沒有,則加載本地SD卡中圖片,最后選擇訪問網(wǎng)絡(luò)。
很多小伙伴都在使用 Glide 加載圖片,出去面試的時候肯定會被問起,“Glide緩存機制,你了解多少?”。這篇博客我來說說我了解到的 Glide 的緩存機制。
默認(rèn)情況下,Glide 會在開始一個新的圖片請求之前檢查以下多級的緩存:
1.活動資源 (Active Resources) - 現(xiàn)在是否有另一個 View 正在展示這張圖片?
2.內(nèi)存緩存 (Memory cache) - 該圖片是否最近被加載過并仍存在于內(nèi)存中?
3.資源類型(Resource) - 該圖片是否之前曾被解碼、轉(zhuǎn)換并寫入過磁盤緩存?
4.數(shù)據(jù)來源 (Data) - 構(gòu)建這個圖片的資源是否之前曾被寫入過文件緩存?
設(shè)置內(nèi)存緩存開關(guān):
設(shè)置磁盤緩存模式:
可以設(shè)置4種模式:
本文源碼解析基于Glide 4.6.1
系列文章
Android 【手撕Glide】--Glide緩存機制
Android 【手撕Glide】--Glide緩存機制(面試)
Android 【手撕Glide】--Glide是如何關(guān)聯(lián)生命周期的?
Glide緩存分為內(nèi)存緩存和磁盤緩存,其中內(nèi)存緩存是由弱引用+LruCache組成。
取的順序是:弱引用、LruCache、磁盤
存的順序是:磁盤、弱引用、LruCache
這張親手制作的圖片,方便大家更直觀的理解緩存機制的整體流程,結(jié)合文末總結(jié)效果更佳。喜歡的記得點贊!
概述
1、弱引用是由這樣一個HashMap維護(hù),key是緩存的key,這個key由圖片url、width、height等10來個參數(shù)組成;value是圖片資源對象的弱引用形式。
2、LruCache是由一個LinkedHashMap維護(hù),根據(jù)Lru算法來管理圖片。大致的原理是利用linkHashMap鏈表的特性,把最近使用過的文件插入到列表頭部,沒使用的圖片放在尾部;然后當(dāng)圖片大小到達(dá)預(yù)先設(shè)置的一個閥值的時候 ,按算法刪除列表尾部的部分?jǐn)?shù)據(jù)。由于篇幅有限,這里不講解LruCache和DiskLruCache的底層原理,這里推薦一篇 圖解LinkedHashMap原理
這是Glide自定義的LruCache
存取原理
取數(shù)據(jù)
在內(nèi)存緩存中有一個概念叫圖片引用計數(shù)器 ,具體來說是在 EngineResource 中定義一個 acquired 變量用來記錄圖片被引用的次數(shù),調(diào)用 acquire() 方法會讓變量加1,調(diào)用 release() 方法會讓變量減1。
獲取圖片資源是先從弱引用取緩存,拿到的話,引用計數(shù)+1;沒有的話從LruCache中拿緩存,拿到的話,引用計數(shù)也是+1,同時把圖片從LruCache緩存轉(zhuǎn)移到弱應(yīng)用緩存池中;再沒有的話就通過 EngineJob 開啟線程池去加載圖片,拿到的話,引用計數(shù)也是+1,會把圖片放到弱引用。
存數(shù)據(jù)
很明顯,這是加載圖片之后的事情。通過 EngineJob 開啟線程池去加載圖片,取到數(shù)據(jù)之后,會回調(diào)到主線程,把圖片存到弱引用。當(dāng)圖片不再使用的時候,比如說暫停請求或者加載完畢或者清除資源時,就會將其從弱引用中轉(zhuǎn)移到 LruCache 緩存池中。 總結(jié)一下,就是正在使用中的圖片使用 弱引用 來進(jìn)行緩存,暫時不用的圖片使用 LruCache 來進(jìn)行緩存的功能;同一張圖片只會出現(xiàn)在 弱引用 和 LruCache 中的一個。
為什么要引入軟引用?
1、分壓策略,減少Lrucache 中 trimToSize 的概率。如果正在remove的是張大圖,lrucache正好處在臨界點,此時remove操作,將延緩Lrucache的 trimToSize 操作;
2 提高效率:弱引用用的是 HashMap ,Lrucache用的是 LinkedHashMap ,從訪問效率而言,肯定是 HashMap 更高。
Glide磁盤緩存策略(4.x)
如果在內(nèi)存緩存中沒獲取到數(shù)據(jù)會通過 EngineJob 開啟線程池去加載圖片,這里有2個關(guān)鍵類: DecodeJob 和 EngineJob 。 EngineJob 內(nèi)部維護(hù)了線程池,用來管理資源加載,當(dāng)資源加載完畢的時候通知回調(diào); DecodeJob 是線程池中的一個任務(wù)。
磁盤緩存是通過 DiskLruCache 來管理的,根據(jù)緩存策略,會有2種類型的圖片, DATA (原始圖片)和 RESOURCE (轉(zhuǎn)換后的圖片)。磁盤緩存依次通過 ResourcesCacheGenerator 、 SourceGenerator 、 DataCacheGenerator 來獲取緩存數(shù)據(jù)。 ResourcesCacheGenerator 獲取的是轉(zhuǎn)換過的緩存數(shù)據(jù); SourceGenerator 獲取的是未經(jīng)轉(zhuǎn)換的原始的緩存數(shù)據(jù); DataCacheGenerator 是通過網(wǎng)絡(luò)獲取圖片數(shù)據(jù)再按照按照緩存策略的不同去緩存不同的圖片到磁盤上。
Glide緩存分為 弱引用+ LruCache+ DiskLruCache ,其中讀取數(shù)據(jù)的順序是:弱引用 LruCache DiskLruCache網(wǎng)絡(luò);寫入緩存的順序是:網(wǎng)絡(luò) -- DiskLruCache-- LruCache--弱引用
內(nèi)存緩存分為弱引用的和 LruCache ,其中正在使用的圖片使用弱引用緩存,暫時不使用的圖片用 LruCache緩存,這一點是通過 圖片引用計數(shù)器(acquired變量)來實現(xiàn)的,詳情可以看內(nèi)存緩存的小結(jié)。
磁盤緩存就是通過DiskLruCache實現(xiàn)的,根據(jù)緩存策略的不同會獲取到不同類型的緩存圖片。它的邏輯是:先從轉(zhuǎn)換后的緩存中取;沒有的話再從原始的(沒有轉(zhuǎn)換過的)緩存中拿數(shù)據(jù);再沒有的話就從網(wǎng)絡(luò)加載圖片數(shù)據(jù),獲取到數(shù)據(jù)之后,再依次緩存到磁盤和弱引用。
參考:
面試官:簡歷上最好不要寫Glide,不是問源碼那么簡單
原來面試的時候?qū)懢℅lide,這樣問我這樣答
Android的Glide在加載圖片時候內(nèi)部默認(rèn)使用了緩存機制,Glide的緩存機制分為兩級,第一級是內(nèi)存緩存,然后第二級是硬盤緩存。緩存的過程首先是在內(nèi)存中緩存,然后將加載的圖片資源緩存到硬盤,這樣就可以在隨后的再次加載中使用緩存了,Glide使用緩存時候首先要檢查內(nèi)存這一層級是否緩存了相應(yīng)的緩存,如果有,則直接使用,如果沒有,則深入到硬盤緩存中檢查是否有,如果有,則加載之,如果到這一步驟還沒有,那么就只能作為一個全新的資源加載了。
有些特定軟件會在緩存圖片文件夾自動生成名為“.nomedia”的文件,屏蔽了其他軟件的掃描。代表此文件夾里面的MP3、MP4、RMVB、JPEG等圖片音頻視頻等媒體文件,所以系統(tǒng)圖庫看不到。但一些特殊軟件如 快圖、MX Player也可以在設(shè)置中取消辨認(rèn)這些文件!
網(wǎng)站名稱:android圖片的緩存,手機圖片緩存
鏈接分享:http://chinadenli.net/article43/dsgdges.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、手機網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站策劃、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)