內存緩存的擴展還是蠻重要的,無論是數據結構還是具體的實現還是值得我們進行細細的品味,下面咱們就一起能品味這裡面的趣味吧。
內存緩存的擴展主要學習下面的幾個類:FIFOLimitedMemoryCache、FuzzyKeyMemoryCache、LargestLimitedMemoryCache、LimitedAgeMemoryCache、LRULimitedMemoryCache、LruMemoryCache、UsingFreqLimitedMemoryCache以及WeakMemoryCache。
Ok,首先我們學習LimitedMemoryCache這個類。LimitedMemoryCache是LimitedMemoryCache的子類,其成員變量如下:
private final List queue = Collections.synchronizedList(new LinkedList());
由此可知內存緩存的數據結構是線程安全的隊列。
分析其函數,我們知道隊列的操作在這裡也是可以得到對應的體現。隻是創建軟引用的方法還是可以觀察一下。
@Override protected Reference createReference(Bitmap value) { return new WeakReference(value); }
接下來,需要分析的第二個類是FuzzyKeyMemoryCache,按照類的註釋,這個類是框架內部使用的,它實現瞭MemoryCache這個接口。當前的類的成員變量如下:
private final MemoryCache cache; private final Comparator keyComparator;
由MemoryCache這個成員變量並且是在當前的構造函數中初始化可知,這個類是個包裝器,真正的功能是由cache實現的。
接下來我們要分析的類是LargestLimitedMemoryCache,這個類依舊是LimitedMemoryCache的子類,
其成員變量如下:
private final Map valueSizes = Collections.synchronizedMap(new HashMap());
由此可見,當前的緩存的數據結構已經發生瞭變化,當前已經是HashMap,HashMa的優勢在於刪除離散的數據的效率高。
重點關註一下其刪除對象的方法:
@Override protected Bitmap removeNext() { Integer maxSize = null; Bitmap largestValue = null; Set<Entry> entries = valueSizes.entrySet(); synchronized (valueSizes) { for (Entry entry : entries) { if (largestValue == null) { largestValue = entry.getKey(); maxSize = entry.getValue(); } else { Integer size = entry.getValue(); if (size > maxSize) { maxSize = size; largestValue = entry.getKey(); } } } } valueSizes.remove(largestValue); return largestValue; }
由此可見,迭代獲取最大的圖片,並且進行刪除。
接下來需要分析的類是LimitedAgeMemoryCache,
繼續關註當前的成員變量:
private final MemoryCache cache; private final long maxAge; private final Map loadingDates = Collections.synchronizedMap(new HashMap());
可見當前的成員變量loadingDates,當前的是HashMap。
重點關註下面的成員變量
@Override public Bitmap get(String key) { Long loadingDate = loadingDates.get(key); if (loadingDate != null && System.currentTimeMillis() - loadingDate > maxAge) { cache.remove(key); loadingDates.remove(key); } return cache.get(key); }
如果當前的文件已經達到刪除的時間,就直接從緩存的數據結構中刪除當前的對象。
由於比較多,這一講就到這裡停筆瞭,後面剩餘的幾個類將會在後面的文章中講解。