1、關(guān)于Bitmap
在安卓2.3.3(API級(jí)別10)之前,Bitmap像素?cái)?shù)據(jù)和Bitmap對(duì)象是分開存儲(chǔ)的春叫,像素?cái)?shù)據(jù)是存儲(chǔ)在native memory中,對(duì)象存儲(chǔ)在Dalvik heap中,native memory中的像素?cái)?shù)據(jù)不是以一種可預(yù)見的方式釋放,可能導(dǎo)致應(yīng)用程序暫時(shí)超過其內(nèi)存限制和崩潰暂殖,所以在Android2.3.3(API 10)之前你必須要調(diào)用recycle()方法來釋放掉內(nèi)存避免出現(xiàn)OOM,當(dāng)然前提是確定這個(gè)bitmap不再使用价匠,否則會(huì)出現(xiàn) "Canvas: trying to use a recycled bitmap".
在Android3.0(API 11)之后,Bitmap的像素?cái)?shù)據(jù)和Bitmap對(duì)象一起存儲(chǔ)在Dalvik heap中呛每,所以我們不用手動(dòng)調(diào)用recycle()來釋放Bitmap對(duì)象踩窖,內(nèi)存的釋放都交給垃圾回收器來做。
2晨横、資源圖片占的內(nèi)存
我們圖片的尺寸是720×1280洋腮,所有像素點(diǎn)占用內(nèi)存=720x1280x4=3686400 byte=3.515625M,這個(gè)大小是圖片不做任何處理時(shí)占用的內(nèi)存大小手形。但是系統(tǒng)在將圖片處理成Drawable對(duì)象的時(shí)候會(huì)作一些處理啥供。
有兩個(gè)非常重要的參數(shù),inDensity和inTargetDensity:
1叁幢、inDensity表示被設(shè)定的圖像密度滤灯,決定這個(gè)值的是圖片所放置的文件目錄坪稽,比如drawable-hdpi曼玩、drawable-xhdpi等等,其對(duì)應(yīng)的density如下表:
如果圖片放在drawable-hdpi下窒百,inDensity=240
2黍判、inTargetDensity表示最終需要適配到的圖片密度,這個(gè)值由手機(jī)設(shè)備來決定篙梢,手機(jī)屏幕越高清這個(gè)值越大顷帖,而我們例子中720p的小米2S對(duì)應(yīng)的densityDpi=320。
如果inDensity的值和inTargetDensity的值不相等渤滞,那么圖片尺寸就被會(huì)縮放贬墩,縮放的比例為 inTargetDensity / inDensity。
因?yàn)閳D片占用內(nèi)存與圖片的尺寸有關(guān)妄呕,如果被尺寸縮放了陶舞,內(nèi)存大小就變了。前面未作任何縮放處理的720×1280圖占用內(nèi)存是3.515625M绪励,假設(shè)放在drawable-ldpi目錄下inDensity=120肿孵,設(shè)備inTargetDensity=320,那么最終的占用內(nèi)存大小將是3.515625Mx(320/120)x(320/120)=25M疏魏。
一張圖片占用25M大小停做,很恐怖的一個(gè)值,這種情況下大莫,app估計(jì)直接掛了蛉腌,如果放在drawable-hdpi下,占用就是6.25M,drawable-xhdpi下占用是3.515625M烙丛。由此可見贯吓,圖片放置的目錄一定要慎重。
最終我們得出一個(gè)公式:
資源圖片內(nèi)存大小 = 寬 x 高 x 4 x (設(shè)備密度 / 資源維度密度)x(設(shè)備密度 / 資源維度密度)