由于Bitmap的特殊性以及Android對單個應(yīng)用所施加的內(nèi)存限制,比如16M,這導(dǎo)致加載Bitmap的時候很容易出現(xiàn)內(nèi)存溢出。比如以下場景:

java.lang.OutofMemoryError:bitmap size exceeds VM budget

Android中常用的緩存策略也是很有意思,緩存策略一個通用的思想,可以用到很多場景中,比如在實際開發(fā)中經(jīng)常需要用到Bitmap做緩存。通過緩存策略,我們不需要每次都從網(wǎng)絡(luò)上請求圖片或者從存儲設(shè)備中加載圖片,這樣就極大地提高了圖片的加載效率以及產(chǎn)品的用戶體驗。目前比較常用的緩存策略是LruCache和DiskLruCache,其中LruCache常被用做內(nèi)存緩存,而DiskLruCache用做存儲緩存。Lru是Least Recently Used的縮寫,即最近最少使用算法,這種算法的核心思想:當(dāng)緩存快滿時,會淘汰近期最少使用的緩存目標(biāo),很顯然Lru算法的思想是很容易被接受的。

Bitmap的高效加載

Bitmap在Android中指的是一張圖片,可以是png格式也可以是jpg等其他常見的圖片格式。BitmapFactory類提供了四類方法:decodeFile、decodeResource、decodeStream和decodeByteArray,分別用于支持從文件系統(tǒng)、資源、輸入流以及字節(jié)數(shù)組中加載出一個Bitmap對象,其中decodeFile和decodeResource又間接調(diào)用了decodeStream方法,這四類方法最終是在Android的底層實現(xiàn)的,對應(yīng)著BitmapFactory類的幾個native方法。

如何高效地加載Bitmap呢,其實核心思想也簡單,那就是采用BitmapFactory.Options來加載所需尺寸的圖片。主要是用到它的inSampleSize參數(shù),即采樣率。當(dāng)inSampleSize為1時,采樣后的圖片大小為圖片的原始大小,當(dāng)inSampleSize大于1時,比如為2,那么采樣后的圖片其寬/寬均為原圖大小的1/2,而像素數(shù)為原圖的1/4,其占有的內(nèi)存大小也為原圖的1/4。從最新官方文檔中指出,inSampleSize的取值應(yīng)該是2的指數(shù),比如1、2、4、8、16等等。

通過采樣率即可有效地加載圖片,那么到底如何獲取采樣率呢,獲取采樣率也很簡單,循序如下流程: