Android內(nèi)功之圖片緩存

說(shuō)明:

有很多開(kāi)源的圖片緩存庫(kù),功能強(qiáng)大的有內(nèi)存和磁盤存儲(chǔ)方式混用的,這里只考慮android自帶的LruCache,通過(guò)它把LinkedHashMap,HashMap相關(guān)知識(shí)串起來(lái),這也是面試中常被問(wèn)到的點(diǎn)。

使用情景:

網(wǎng)絡(luò)獲取圖片后,放到內(nèi)存里,下次使用直接從內(nèi)存讀,不再通過(guò)網(wǎng)絡(luò)獲取,這里注意緩存容量和app可用內(nèi)存的占比。

使用文檔:

https://developer.android.com/reference/android/util/LruCache.html

源碼位置:

android.util.LruCache.java

LruCache繼承自LinkedHashMap繼承自HashMap,逐個(gè)講解。

HashMap的存儲(chǔ)結(jié)構(gòu)為數(shù)組(每個(gè)位置稱之為bucket)+ 鏈表,K通過(guò)算法得到要存到哪個(gè)bucked里,如果哈希沖突,且key不相同則放到bucket存儲(chǔ)的鏈表里。說(shuō)下hash沖突的概念,hash的作用是原空間到另一空間的映射,算法肯定會(huì)出現(xiàn)相同的映射值,這就是沖突,對(duì)于hashmap,其沖突的意思就是K通過(guò)算法后得到的值相同(即存到相同的bucket里)。

LinkedHashMap繼承HashMap,即延用HashMap的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)

對(duì)Entry多了層包裝,添加雙向鏈表的頭尾指針,用來(lái)實(shí)現(xiàn)排序,排序規(guī)則依據(jù)accessOrder變量:false:按照插入順序(默認(rèn));true按訪問(wèn)順序

說(shuō)白了就是每次訪問(wèn)的K會(huì)放到第一位,這樣總有末尾元素,是不經(jīng)常被訪問(wèn)的,稱之為eldest。LruCache的最少使用算法就是依據(jù)這個(gè)機(jī)制實(shí)現(xiàn)的。

private static class LinkedHashMapEntry extends HashMapEntry {

LinkedHashMapEntry before, after;

private transient LinkedHashMapEntry header; //head實(shí)現(xiàn)雙向鏈表

private final boolean accessOrder;

有了上面的基礎(chǔ),LruCache就很容易理解了,LruCache put一個(gè)元素后,put一個(gè)元素后,調(diào)用trimToSize 如果超過(guò)maxSize,刪除eldest;

public void trimToSize(int maxSize) {

while (true) {

K key;

V value;

synchronized (this) {

if (size < 0 || (map.isEmpty() && size != 0)) {

throw new IllegalStateException(getClass().getName()

+ ".sizeOf() is reporting inconsistent results!");

}

if (size <= maxSize) {

break;

}

Map.Entry toEvict = map.eldest();

if (toEvict == null) {

break;

}

key = toEvict.getKey();

value = toEvict.getValue();

map.remove(key);

size -= safeSizeOf(key, value);

evictionCount++;

}

entryRemoved(true, key, value, null);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容