Bitmap的載入與快取

2022-02-26 11:16:13 字數 2404 閱讀 4852

android系統中一般用bitmap物件表示,它支援png,jpg等常見格式。通常情況下的體積都比較大,單個應用允許使用的記憶體又是有限的,所以我們需要採取一些手段減少記憶體占用並提高載入速度。

假設我們用imageview顯示,通常它的尺寸要比的尺寸小很多,那麼把整個載入進記憶體顯然是沒有必要的。在圖形學上有個名詞叫「下取樣」,作用就是降低影象的解析度,使其符合顯示區域的大小。通過bitmapfactory.options類,我們也可以實現同樣的功能。這裡主要用到了它的 insamplesize 引數,如果它的值是1,那麼取樣後的跟原圖一致,如果是2,那麼取樣後的長和寬都是原來的一半,占用的記憶體也就是原來的四分之一。

public static bitmap decodesamplebitmapfrombytes(byte data)

快取在計算機領域使用非常廣泛,如http快取,dns快取等等,快取既可以提高響應速度,又能節省伺服器頻寬,在載入上它同樣適用。android開發中一般會對做兩級快取:記憶體快取和檔案快取,而且它們都有庫供我們使用,分別是lrucache和disklrucache。從名字就可以看出兩者都使用了lru演算法,即優先淘汰那些近期最少使用的快取。

lrucache是android提供的乙個快取類,一般用來管理記憶體快取。

// #1:確定快取大小。

int maxmemory = (int)(runtime.getruntime().totalmemory() / 1024);

int cachesize = maxmemory / 8;

// #2:重寫sizeof方法計算每個快取物件的記憶體占用。

lrucachemmemorycache = new lrucache(cachesize)

};

lrucache是乙個泛型類可以容納各種物件,因而它無法計算被儲存物件的大小,所以我們需要重寫它的 sizeof 方法,手動進行計算。那lrucache是如何實現的呢,實際上它僅僅是對linkedhashmap進行了封裝並處理了執行緒安全問題。linkedhashmap的建構函式中有乙個布林型別的引數, accessorder ,當它為 true

時元素按訪問順序儲存,為 false

時按插入順序儲存。當元素按訪問順序儲存時在其尾部取出的元素也就是最近最少使用的元素,也就實現了lru演算法。lrucache只需要每次 put 函式被呼叫後計算當前總快取的大小,當其超出門限值時移除位於linkedhashmap尾部的元素即可。

disklrucache同lrucache一樣都使用linkedhashmap實現lru演算法,但disklrucache在實現和使用上更複雜一些,畢竟需要對檔案進行管理。

獲得disklrucache物件需要呼叫 disklrucache.open 函式:

它接收4個引數,第乙個是快取區目錄,第二個是客戶端版本號,disklrucache認為當版本號發生變化時快取是無效的,第三個引數代表每個鍵可以關聯幾個檔案,最後乙個引數指定的快取區的大小。在建立物件時,disklrucache會根據緩衝區目錄下名為「journal」的日誌檔案在linkedhashmap中為快取檔案建立索引,所有對緩衝區的操作都會被記錄在這個檔案中。當緩衝區大小到達門限值後根據lru演算法對檔案進行清理。

讀取快取時使用 disklrucache.get 函式:

public synchronized snapshot get(string key) throws ioexception

函式返回乙個snapshot物件,通過該物件我們可以獲取到快取檔案的輸入流,多個執行緒可以同時使用各自的snapshot物件讀取同乙個key對應的快取。

操作快取時使用 disklrucache.edit 函式:

public editor edit(string key) throws ioexception

建立或更改完畢後用 editor.commit 函式提交或用 editor.abort 函式取消。乙個key對應的快取被操作時仍可以使用snapshot物件讀取其內容,因為editor的所有操作都會先作用於臨時檔案。注意每個key只能同時獲取乙個editor物件,也就是說即使editor沒有做任何操作也要呼叫 editor.abort 或  editor.commit 函式,不然再次獲取時函式返回 null

在 loadbitmapfromhttp 函式中需要將資源放入disklrucache中,在 loadbitmapfromdiskcache 函式中將載入後的bitmap物件放入lrucache中,如此便形成了一條快取鏈。

Bitmap的載入和快取策略

本章主要學習bitmap的載入和cache,由於bitmap的特殊性以及android對單個應用所施加的記憶體限制,導致載入bitmap很容易出現記憶體溢位,因此這裡主要 下如何高效地載入bitmap以及其中所使用的的快取策略.一.bitmap的高效載入 1.核心思想 按一定的取樣率把縮小後再載入....

大Bitmap的載入

高效使用bitmaps有什麼好處?我們常常提到的 android程式優化 通常指的是效能和記憶體的優化,即 更快的響應速度,更低的記憶體占用。android程式的效能和記憶體問題,大部分都和緊密相關,而的載入在很多情況下很用到bitmap 位圖 這個類。而由於bitmap自身的特性 將每個畫素的屬性...

Bitmap的高效載入

如何高效的載入乙個bitmap,這是乙個很有意義的話題,因為在我們開發的過程中,經常會遇到這樣錯誤 outofmemoryerror 這樣的錯誤,很多時候都是因為載入bitmap出現的記憶體溢位.如何載入乙個bitmap bitmap在andriod中指的是一張,那麼如何載入乙個?bitmapfac...