動腦學(xué)院Glide預(yù)習(xí)資料 緩存與解碼復(fù)用

Glide 使用簡明的流式語法API醇疼,大多數(shù)情況下,可能完成圖片的設(shè)置你只需要:
Glide.with(activity) .load(url) .into(imageView);

默認(rèn)情況下圈澈,Glide 會在開始一個新的圖片請求之前檢查以下多級的緩存:
1. 活動資源 (Active Resources) 
2. 內(nèi)存緩存 (Memory Cache) 
3. 資源類型(Resource Disk Cache)
4. 原始數(shù)據(jù) (Data Disk Cache)

活動資源:如果當(dāng)前對應(yīng)的圖片資源正在使用,則這個圖片會被Glide放入活動緩存凌唬。
內(nèi)存緩存:如果圖片最近被加載過,并且當(dāng)前沒有使用這個圖片潮梯,則會被放入內(nèi)存中
資源類型:  被解碼后的圖片寫入磁盤文件中,解碼的過程可能修改了圖片的參數(shù)(如:inSampleSize惨恭、inPreferredConfig)
原始數(shù)據(jù):  圖片原始數(shù)據(jù)在磁盤中的緩存(從網(wǎng)絡(luò)秉馏、文件中直接獲得的原始數(shù)據(jù))

在調(diào)用into之后,Glide會首先從Active Resources查找當(dāng)前是否有對應(yīng)的活躍圖片脱羡,沒有則查找內(nèi)存緩存萝究,沒有則查找資源類型,沒有則查找數(shù)據(jù)來源轻黑。
緩存查找.png

相較于常見的內(nèi)存+磁盤緩存糊肤,Glide將其緩存分成了4層琴昆。

第一層 活動資源

當(dāng)需要加載某張圖片能夠從內(nèi)存緩存中獲得的時候氓鄙,在圖片加載時主動將對應(yīng)圖片從內(nèi)存緩存中移除,加入到活動資源中业舍。
這樣也可以避免因為達(dá)到內(nèi)存緩存最大值或者系統(tǒng)內(nèi)存壓力導(dǎo)致的內(nèi)存緩存清理抖拦,從而釋放掉活動資源中的圖片(recycle)。
活動資源中是一個”引用計數(shù)"的圖片資源的弱引用集合舷暮。

因為同一張圖片可能在多個地方被同時使用态罪,每一次使用都會將引用計數(shù)+1,而當(dāng)引用計數(shù)為0時候,則表示這個圖片沒有被使用也就是沒有強(qiáng)引用了下面。這樣則會將圖片從活動資源中移除复颈,并加入內(nèi)存緩存。
加入內(nèi)存緩存.png

第二層 內(nèi)存緩存

內(nèi)存緩存默認(rèn)使用LRU(緩存淘汰算法/最近最少使用算法),當(dāng)資源從活動資源移除的時候沥割,會加入此緩存耗啦。使用圖片的時候會主動從此緩存移除,加入活動資源机杜。

LRU在Android support-v4中提供了LruCache工具類帜讲。
LruCache.png

構(gòu)造LinkedHashMap的accessOrder設(shè)置為true。在使用的此map的時候椒拗,自動進(jìn)行排序(每次get/put,會將使用的value放入鏈表header頭部)似将。LruCache會在每次get/put的時候判斷數(shù)據(jù)如果達(dá)到了maxSize,則會優(yōu)先刪除tail尾端的數(shù)據(jù)。
LRU.png

磁盤緩存同樣使用LRU算法蚀苛。

第三在验、四層 磁盤緩存

Resource 緩存的是經(jīng)過解碼后的圖片,如果再使用就不需要再去進(jìn)行解碼配置(BitmapFactory.Options),加快獲得圖片速度堵未。比如原圖是一個100x100的ARGB_8888圖片译红,在首次使用的時候需要的是50x50的RGB_565圖片,那么Resource將50x50 RGB_565緩存下來兴溜,再次使用此圖片的時候就可以從 Resource 獲得侦厚。不需要去計算inSampleSize(縮放因子)耻陕。
Data 緩存的則是圖像原始數(shù)據(jù)。

Bitmap復(fù)用

如果緩存都不存在刨沦,那么會從源地址獲得圖片(網(wǎng)絡(luò)/文件)诗宣。而在解析圖片的時候會需要可以獲得BitmapPool(復(fù)用池),達(dá)到復(fù)用的效果想诅。

復(fù)用前.png
復(fù)用后.png
復(fù)用效果如上召庞。在未使用復(fù)用的情況下,每張圖片都需要一塊內(nèi)存来破。而使用復(fù)用的時候篮灼,如果存在能被復(fù)用的圖片會重復(fù)使用該圖片的內(nèi)存。
所以復(fù)用并不能減少程序正在使用的內(nèi)存大小徘禁。Bitmap復(fù)用诅诱,解決的是減少頻繁申請內(nèi)存帶來的性能(抖動、碎片)問題送朱。
https://developer.android.google.cn/topic/performance/graphics/manage-memory.html
設(shè)置inBitmap復(fù)用.png
獲得可復(fù)用Bitmap.png
檢查Bitmap是否可復(fù)用.png

Google給出的案例可以看出:
使用方式為在解析的時候設(shè)置Options的inBitmap屬性娘荡。

  1. Bitmap的inMutable需要為true。
  2. Android 4.4及以上只需要被復(fù)用的Bitmap的內(nèi)存必須大于等于需要新獲得Bitmap的內(nèi)存驶沼,則允許復(fù)用此Bitmap炮沐。
  3. 4.4以下(3.0以上)則被復(fù)用的Bitmap與使用復(fù)用的Bitmap必須寬、高相等并且使用復(fù)用的Bitmap解碼時設(shè)置的inSampleSize為1回怜,才允許復(fù)用大年。

因此Glide中,在每次解析一張圖片為Bitmap的時候(磁盤緩存玉雾、網(wǎng)絡(luò)/文件)會從其BitmapPool中查找一個可被復(fù)用的Bitmap翔试。

BitmapPool是Glide中的Bitmap復(fù)用池,同樣適用LRU來進(jìn)行管理。
當(dāng)一個Bitmap從內(nèi)存緩存 被動 的被移除(內(nèi)存緊張抹凳、達(dá)到maxSize)的時候并不會被recycle遏餐。而是加入這個BitmapPool,只有從這個BitmapPool 被動
被移除的時候,Bitmap的內(nèi)存才會真正被recycle釋放赢底。

原創(chuàng)文章失都,轉(zhuǎn)載請聯(lián)系作者哦~~

歡迎進(jìn)群一起交流學(xué)習(xí):Android開發(fā)交流群 481302961


2碼.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幸冻,隨后出現(xiàn)的幾起案子粹庞,更是在濱河造成了極大的恐慌,老刑警劉巖洽损,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庞溜,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)流码,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門又官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漫试,你說我怎么就攤上這事六敬。” “怎么了驾荣?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵外构,是天一觀的道長。 經(jīng)常有香客問我播掷,道長审编,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任歧匈,我火速辦了婚禮垒酬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眯亦。我一直安慰自己伤溉,他們只是感情好般码,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布妻率。 她就那樣靜靜地躺著,像睡著了一般板祝。 火紅的嫁衣襯著肌膚如雪宫静。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天券时,我揣著相機(jī)與錄音孤里,去河邊找鬼。 笑死橘洞,一個胖子當(dāng)著我的面吹牛捌袜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炸枣,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼虏等,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了适肠?” 一聲冷哼從身側(cè)響起霍衫,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侯养,沒想到半個月后敦跌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡逛揩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年柠傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了麸俘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡惧笛,死狀恐怖疾掰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徐紧,我是刑警寧澤静檬,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站并级,受9級特大地震影響拂檩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘲碧,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一稻励、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愈涩,春花似錦望抽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毁腿,卻和暖如春辑奈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背已烤。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工鸠窗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胯究。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓稍计,卻偏偏與公主長得像,于是被迫代替她去往敵國和親裕循。 傳聞我的和親對象是個殘疾皇子臣嚣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容