Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 詳細講解Android圖片下載框架UniversialImageLoader之內存緩存擴展(四)

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

編輯:關於Android編程

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

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

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


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





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved