詳細講解Android圖片下載框架UniversialImageLoader之內存緩存擴展(四)

內存緩存的擴展還是蠻重要的,無論是數據結構還是具體的實現還是值得我們進行細細的品味,下面咱們就一起能品味這裡面的趣味吧。

內存緩存的擴展主要學習下面的幾個類: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);
	}

如果當前的文件已經達到刪除的時間,就直接從緩存的數據結構中刪除當前的對象。

由於比較多,這一講就到這裡停筆瞭,後面剩餘的幾個類將會在後面的文章中講解。


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *