計算Bitmap大小
影響B(tài)itmap大小因素
1.圖片長度
2.圖片寬度
3.圖片的縮放比
4.每個像素所占的字節(jié)(Bitmap的RGB值)
BitMap內(nèi)存的計算公式為:
一張圖片(BitMap)占用的內(nèi)存=圖片長度 * 圖片寬度單位 * 像素占用的字節(jié)數(shù)
優(yōu)化-內(nèi)存回收
在Android2.3.3之前推薦使用Bitmap.recycle()方法進行Bitmap的內(nèi)存回收牢撼。
例:
if(bitmap != null && !bitmap.isRecycled()){
// 回收并且置為null
bitmap.recycle();
bitmap = null;
}
備注:只有當確定這個Bitmap不被引用的時候才能調(diào)用此方法权她,否則會有“Canvas: trying to use a recycled bitmap”這個錯誤。
Tip:Bitmap類的構造方法都是私有的妓湘,所以開發(fā)者不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態(tài)方法來實例化一個Bitmap丑瞧。仔細查看BitmapFactory的源代碼可以看到淫半,生成Bitmap對象最終都是通過JNI調(diào)用方式實現(xiàn)的。所以羞反,加載Bitmap到內(nèi)存里以后,是包含兩部分內(nèi)存區(qū)域的囤萤。簡單的說昼窗,一部分是Java部分的,一部分是C部分的涛舍。這個Bitmap對象是由Java部分分配的澄惊,不用的時候系統(tǒng)就會自動回收了,但是那個對應的C可用的內(nèi)存區(qū)域富雅,虛擬機是不能直接回收的掸驱,這個只能調(diào)用底層的功能釋放。所以需要調(diào)用recycle()方法來釋放C部分的內(nèi)存没佑。從Bitmap類的源代碼也可以看到毕贼,recycle()方法里也的確是調(diào)用了JNI方法了的。
優(yōu)化-Bitmap緩存
使用LruCache和DiskLruCache做內(nèi)存和磁盤緩存蛤奢;
優(yōu)化-Bitmap復用
主要就是指的復用內(nèi)存塊鬼癣,不需要在重新給這個bitmap申請一塊新的內(nèi)存,避免了一次內(nèi)存的分配和回收,從而改善了運行效率啤贩。
復用的條件
Android3.0(API 11之后)引入了BitmapFactory.Options.inBitmap字段待秃,設置此字段之后解碼方法會嘗試復用一張存在的Bitmap。這意味著Bitmap的內(nèi)存被復用痹屹,避免了內(nèi)存的回收及申請過程章郁,顯然性能表現(xiàn)更佳。不過痢掠,使用這個字段有幾點限制:
聲明可被復用的Bitmap必須設置inMutable為true驱犹;
- Android4.4(API 19)之前只有格式為jpg、png足画,同等寬高(要求苛刻)雄驹,inSampleSize為1的Bitmap才可以復用;
- Android4.4(API 19)之前被復用的Bitmap的inPreferredConfig會覆蓋待分配內(nèi)存的Bitmap設置的inPreferredConfig淹辞;
- Android4.4(API 19)之后被復用的Bitmap的內(nèi)存必須大于需要申請內(nèi)存的Bitmap的內(nèi)存医舆;
- Android4.4(API 19)之前待加載Bitmap的Options.inSampleSize必須明確指定為1。