關於Android中的緩衝使用

來源:互聯網
上載者:User

在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非常類似,會將訪問的對象移到最後,使用這個容器,我們很容易知道那個圖片最久沒有被使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.