在Android中處理圖片問題時,一般是需要使用緩衝的,緩衝主要包括記憶體緩衝,硬碟緩衝,這裡主要介紹記憶體緩衝和硬碟緩衝實現的機制,並不是具體實現。
硬碟緩衝
public interface DiscCacheAware {void put(String key,File file);File get(String key);void clear();}
對於一個硬碟緩衝,通常需要提供上面三種操作。注意:其中的put操作並非將一個檔案序號(存放到硬碟),而是要計算當前硬碟緩衝(緩衝肯定需要限定大小)是否已經滿了,需要採用一種演算法將某些圖片刪除。
我一般採用刪除最先加入的圖片:在實作類別定義如下欄位:private final Map<File,Long> lastUsageDates=Collections.synchronizedMap(new HashMap<File,Long>());以檔案為鍵,檔案最近修改時間為值,在put方法中統計緩衝容量是否滿了,滿了就刪除最先加進來的檔案記憶體緩衝
public interface MemoryCacheAware <K,V>{boolean put(K key,V value);V get(K key);void remove(K key);Collection<K> keys();void clear();}
使用記憶體緩衝時,我一般使用LRU演算法,此時在實作類別中引入如下欄位:
private final Map<String,Reference<Bitmap>> softMap=Collections.synchronizedMap(new HashMap<String,Reference<Bitmap>>());private final List<Bitmap> hardCache = Collections.synchronizedList(new LinkedList<Bitmap>());private final Map<String, Bitmap> lruCache = Collections.synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.1f, true));
第一個HashMap使用檔案名稱(或者對檔案名稱進行某種編碼)為鍵,圖片的弱引用為值,簡單的說它就是記憶體的緩衝。第二個List是儲存的當前所有圖片的強引用,所以只要一個Bitmap在List中存在,那麼必定在softMap中存在,如果我們把hardCache中一個Bitmap刪除,那麼下次垃圾收集器啟動時,softMap中的Bitmap也會被回收使用hardCache統計當前緩衝是否已經滿了,如果滿了就要從List中刪除,從而listMap中的圖片也會刪除。由於我採用的是LRU演算法,所以就使用了第三個 LinkedHashMap這個容器,它的特點和LRU非常類似,會將訪問的對象移到最後,使用這個容器,我們很容易知道那個圖片最久沒有被使用。