1. 程式人生 > >Android記憶體快取和磁碟快取的實現

Android記憶體快取和磁碟快取的實現

記憶體快取

Android自帶的LruCache實現了記憶體快取,LruCache內部主要使用LinkedHashMap的特性來實現,因為LinkedHashMap可支援FIFO和LRU訪問。

LinkedHashMap的特點

LinkedHashMap繼承自HashMap,同時也繼承了HashMap的陣列+連結串列的實現,不過添加了以下功能:

  • 把所有的節點維護成一個雙向迴圈連結串列
  • accessOrder欄位,預設false,即FIFO的訪問;為true時,實現LRU訪問,具體實現就是在,put時,先刪除存在的節點,然後新增到前面節點的前面(就是往前挪了一個位置)
  • 到達負載因子時,會有對應得方法設定LinkedHashMap是自動擴容還是實現快取功能

LruCache的實現

在LinkedHashMap上裝飾了以下功能:

  • 不能存空鍵或空值
  • 新增執行緒安全
  • 對元素的大小進行了自定義,如下:

    //定義每個節點的大小,快取圖片時,返回的是值的位元組數。相應的最大容量也是快取的大小,即可快取的總位元組數。
    protected int sizeOf(K key, V value) {
        return 1;
    }

磁碟快取