一:Bitmap的高效加載
BitmapFactory類(lèi)提供了四類(lèi)方法:decodeFile,decodeResource,decodeStream和decodeByteArray,分別用于支持從文件系統(tǒng)衫哥,資源,輸入流以及字節(jié)數(shù)組中加載出一個(gè)Bitmap對(duì)象笆搓,其中decodeFile和decodeResource又間接調(diào)用了decodeStream方法抱慌,這四類(lèi)方法最終是在Android的底層實(shí)現(xiàn)的宙暇,對(duì)應(yīng)著B(niǎo)itmapFactory類(lèi)的幾個(gè)native方法。
高效加載Bitmap核心思想就是采用BitmapFactory.Options來(lái)加載所需尺寸的圖片,例如通過(guò)ImageView顯示圖片房维,它并沒(méi)有原始圖片尺寸那么大,這時(shí)候沒(méi)必要把整個(gè)圖片加載進(jìn)來(lái)抬纸,ImageView并沒(méi)有辦法顯示原始的圖片咙俩。通過(guò)BitmapFactory.Options就可以按一定的采樣率來(lái)加載縮小后的圖片,這樣就會(huì)降低內(nèi)存占用,一定程度避免OOM阿趁,提高了Bitmap加載時(shí)性能膜蛔。
通過(guò)BitmapFactory.Options來(lái)縮放圖片,主要用到了它的inSampleSize參數(shù)脖阵,即采樣率皂股。當(dāng)inSampleSize為1時(shí),采樣后的圖片大小為圖片的原始大小命黔。當(dāng)大于1時(shí)呜呐,比如2,采樣后的圖片寬高均為原圖大小的1/2纷铣,而像素為原圖的1/4卵史,其占有的內(nèi)存大小也為原圖的1/4.。
如何獲取采樣率搜立?
1.將BitmapFactory.Options的inJustDecodeBounds參數(shù)設(shè)為true并加載圖片以躯。
2.從BitmapFactory.Options中取出圖片的原始寬高信息,它們對(duì)應(yīng)于outWidth和outHeight參數(shù)啄踊。
3.根據(jù)采樣率的規(guī)則并結(jié)合目標(biāo)View的所需大小計(jì)算出采樣率inSampleSize忧设。
4.將BitmapFactory.Options的inJustDecodeBounds參數(shù)設(shè)為false然后重新加載圖片。
inJustDecodeBounds參數(shù):此參數(shù)設(shè)為true時(shí)颠通,BitmapFactory只會(huì)解析圖片的原始寬高信息址晕,并不會(huì)去真正加載圖片,所以這個(gè)操作是輕量的顿锰。另外需要注意谨垃,這個(gè)時(shí)候BitmapFactory獲取的圖片寬高信息和圖片的位置以及程序運(yùn)行的設(shè)備有關(guān),比如在不同的drawable目錄下或者程序運(yùn)行在不同的屏幕密度的設(shè)備上硼控,都可能導(dǎo)致BitmapFactory獲取到不同的結(jié)果刘陶,這和Android的加載機(jī)制有關(guān)。
二:Android中的緩存策略
緩存策略沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)牢撼。主要包含緩存的添加匙隔,獲取和刪除操作。目前常用的一種緩存算法是LRU(Least Recently Used)核心思想是緩存滿是熏版,優(yōu)先淘汰近期最少使用的緩存對(duì)象纷责。
采用LRU算法的緩存有兩種:LruCache和DiskLruCache,LruCache用于實(shí)現(xiàn)內(nèi)存緩存撼短,DiskLruCache充當(dāng)了村粗設(shè)備緩存再膳。通過(guò)二者的完美結(jié)合,可以實(shí)現(xiàn)一個(gè)具有高實(shí)用價(jià)值的的ImageLoader.
LruCache:是一個(gè)泛型類(lèi)曲横,內(nèi)部采用一個(gè)LinkedHashMap以強(qiáng)引用的方式存儲(chǔ)外界的緩存對(duì)象喂柒,提供了get和put方法完成緩存的獲取和添加,當(dāng)緩存滿時(shí),LruCache會(huì)移除較早使用的緩存對(duì)象胳喷,然后再添加新的緩存對(duì)象。
關(guān)于強(qiáng)引用夭织,軟引用和弱引用的區(qū)別:強(qiáng)引用:直接的對(duì)象引用吭露。軟引用:當(dāng)一個(gè)對(duì)象只有軟引用存在時(shí),系統(tǒng)內(nèi)存不足時(shí)此對(duì)象會(huì)被gc回收尊惰。弱引用:當(dāng)一個(gè)對(duì)象只有弱引用存在時(shí)讲竿,此對(duì)象會(huì)隨時(shí)被gc回收。
DiskLruCache:用于實(shí)現(xiàn)存儲(chǔ)設(shè)備緩存弄屡,磁盤(pán)緩存题禀。它通過(guò)將緩存對(duì)象寫(xiě)入文件系統(tǒng)從而實(shí)現(xiàn)緩存的效果。DiskLruCache得到了Android官方文檔的推薦膀捷,但它不屬于Android SDK一部分迈嘹。