我們知道bitmap會(huì)占用大量的內(nèi)存空間,這節(jié)會(huì)講解什么是inBitmap屬性您觉,如何利用這個(gè)屬性來提升bitmap的循環(huán)效率授滓。前面我們介紹過使用對(duì)象池的技術(shù)來解決對(duì)象頻繁創(chuàng)建再回收的效率問題,使用這種方法在孝,bitmap占用的內(nèi)存空間會(huì)差不多是恒定的數(shù)值私沮,每次新創(chuàng)建出來的bitmap都會(huì)需要占用一塊單獨(dú)的內(nèi)存區(qū)域,如下圖所示:
為了解決上圖所示的效率問題造垛,Android在解碼圖片的時(shí)候引進(jìn)了inBitmap屬性五辽,使用這個(gè)屬性可以得到下圖所示的效果:
使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經(jīng)存在的內(nèi)存區(qū)域杆逗,新解碼的bitmap會(huì)嘗試去使用之前那張bitmap在heap中所占據(jù)的pixel data內(nèi)存區(qū)域鳞疲,而不是去問內(nèi)存重新申請(qǐng)一塊區(qū)域來存放bitmap。利用這種特性悔橄,即使是上千張的圖片翎朱,也只會(huì)僅僅只需要占用屏幕所能夠顯示的圖片數(shù)量的內(nèi)存大小拴曲。下面是如何使用inBitmap的代碼示例:
使用inBitmap需要注意幾個(gè)限制條件:
在SDK 11 -> 18之間澈灼,重用的bitmap大小必須是一致的,例如給inBitmap賦值的圖片大小為100-100委乌,那么新申請(qǐng)的bitmap必須也為100-100才能夠被重用荣回。從SDK 19開始,新申請(qǐng)的bitmap大小必須小于或者等于已經(jīng)賦值過的bitmap大小壕吹。
新申請(qǐng)的bitmap與舊的bitmap必須有相同的解碼格式,例如大家都是8888的踏堡,如果前面的bitmap是8888咒劲,那么就不能支持4444與565格式的bitmap了。
我們可以創(chuàng)建一個(gè)包含多種典型可重用bitmap的對(duì)象池帐偎,這樣后續(xù)的bitmap創(chuàng)建都能夠找到合適的“模板”去進(jìn)行重用挤渔。如下圖所示:
Google介紹了一個(gè)開源的加載bitmap的庫:Glide判导,這里面包含了各種對(duì)bitmap的優(yōu)化技巧眼刃。