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ù)來源轻黑。相較于常見的內(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ù)"的圖片資源的弱引用集合舷暮。
第二層 內(nèi)存緩存
內(nèi)存緩存默認(rèn)使用LRU(緩存淘汰算法/最近最少使用算法),當(dāng)資源從活動資源移除的時候沥割,會加入此緩存耗啦。使用圖片的時候會主動從此緩存移除,加入活動資源机杜。
構(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算法蚀苛。
第三在验、四層 磁盤緩存
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ù)用并不能減少程序正在使用的內(nèi)存大小徘禁。Bitmap復(fù)用诅诱,解決的是減少頻繁申請內(nèi)存帶來的性能(抖動、碎片)問題送朱。
https://developer.android.google.cn/topic/performance/graphics/manage-memory.html
Google給出的案例可以看出:
使用方式為在解析的時候設(shè)置Options的inBitmap屬性娘荡。
- Bitmap的inMutable需要為true。
- Android 4.4及以上只需要被復(fù)用的Bitmap的內(nèi)存必須大于等于需要新獲得Bitmap的內(nèi)存驶沼,則允許復(fù)用此Bitmap炮沐。
- 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