bitmap釋放android
① 在android開發中載入的圖片太大,有好幾十兆,應該怎麼辦
如果圖片太大會造成OOM內存溢出的錯誤,需要用Bitmap的壓縮機制。
解決方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。
2.使用壓縮讀取技術
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//計算出寬高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);
3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。
② android bitmap 浣跨敤鏃跺欐敞鎰忎粈涔
涓銆 闂棰樼殑鑳屾櫙鍜屾剰涔
鍦ˋndroid縐誨姩搴旂敤寮鍙戜腑錛屽笲itmap鐨勪笉灝忓績澶勭悊錛屽緢瀹規槗寮曡搗紼嬪簭鍐呭瓨絀洪棿鑰楀敖鑰屽艱嚧鐨勭▼搴忓穿婧冮棶棰樸傛瘮濡傛垜浠甯擱亣鍒扮殑闂棰橈細
java.lang.OutofMemoryError: bitmap size exceeds VM budget.
瀵艱嚧璇ラ棶棰樼殑鍑虹幇錛屼竴鑸鐢變互涓嬪嚑鏂歸潰鍘熷洜瀵艱嚧錛
寮曞姩璁懼囦竴鑸瀛樺偍絀洪棿闈炲父鏈夐檺銆傚綋鐒朵笉鍚岃懼囧垎閰嶇粰搴旂敤鐨勫唴瀛樼┖闂存槸涓嶅悓鐨勩備絾鐩稿逛笉浣嗘彁楂樼殑璁懼囧垎杈ㄧ巼鑰岃█錛屽唴瀛樼殑鍒嗛厤浠嶇劧鏄鐩稿圭揣寮犵殑銆
Bitmap瀵硅薄甯稿父鍗犵敤澶ч噺鐨勫唴瀛樼┖闂達紝姣斿傦細瀵逛簬2592*1936鐨勮懼囷紝濡傛灉閲囩敤ARGB_8888鐨勬牸寮忓姞杞藉浘鍍忥紝鍐呭瓨鍗犵敤灝嗚揪鍒19MB絀洪棿銆
鍦ˋnroid App涓緇忓父鐢ㄥ埌ListView錛孷iewPager絳夋帶浠訛紝榪欎簺鎺т歡甯鎬細鍖呭惈杈冨ぇ鏁伴噺鐨勫浘鐗囪祫婧愩
浜屻 闂棰樺強鍦烘櫙鍒嗘瀽
1 楂樻晥鍦板姞杞藉ぇ鍥劇墖銆
BitmapFactory綾繪彁渚涗簡涓浜涘姞杞藉浘鐗囩殑鏂規硶錛歞ecodeByteArray(), decodeFile(), decodeResource(), 絳夌瓑銆
涓轟簡閬垮厤鍗犵敤杈冨ぇ鍐呭瓨錛岀粡甯鎬嬌鐢˙itmapFactory.Options 綾伙紝璁劇疆inJustDecodeBounds灞炴т負true銆
//
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds =true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
涓轟簡閬垮厤java.lang.OutOfMemory 鐨勫紓甯革紝鎴戜滑鍦ㄧ湡姝decode鍥劇墖涔嬪墠媯鏌ュ畠鐨勫昂瀵革紝闄ら潪浣犵『瀹氳繖涓鏁版嵁婧愭彁渚涗簡鍑嗙『鏃犺鐨勫浘鐗囦笖涓嶄細瀵艱嚧鍗犵敤榪囧氱殑鍐呭瓨銆
鍔犺澆涓涓鎸夋瘮渚嬬緝灝忕殑鐗堟湰鍒板唴瀛樹腑銆備緥濡傦紝濡傛灉鎶婁竴涓鍘熷浘鏄1024*768 pixel鐨勫浘鐗囨樉紺哄埌ImageView涓128*96 pixel鐨勭緝鐣ュ浘灝辨病鏈夊繀瑕佹妸鏁村紶鍥劇墖閮藉姞杞藉埌鍐呭瓨涓銆備負浜嗗憡璇夎В鐮佸櫒鍘誨姞杞戒竴涓杈冨皬鐨勫浘鐗囧埌鍐呭瓨錛岄渶瑕佸湪浣犵殑BitmapFactory.Options 涓璁劇疆 inSampleSize 涓簍rue 銆備緥濡, 涓涓鍒嗚鯨鐜囦負2048x1536 鐨勫浘鐗囷紝濡傛灉璁劇疆inSampleSize 涓4錛岄偅涔堜細浜у嚭涓涓澶ф備負512x384鐨勫浘鐗囥傚姞杞借繖寮犲皬鐨勫浘鐗囦粎浠呬嬌鐢ㄥぇ姒0.75MB錛屽傛灉鏄鍔犺澆鍏ㄥ浘閭d箞澶ф傝佽姳璐12MB(鍋囪綽itmap鐨勯厤緗鏄疉RGB_8888).
2 涓嶈佸湪涓葷嚎紼嬪勭悊鍥劇墖銆
浼楁墍鍛ㄧ煡鐨勯棶棰橈紝涓嶅啀璧樿堪銆
娉ㄦ剰涓ょ偣錛1. 涓轟簡淇濊瘉浣跨敤鐨勮祫婧愯兘琚鍥炴敹錛屽緩璁浣跨敤WeakReference, 浠ュ簲鐢ㄥ唴瀛樺唴瀛樼揣寮犳椂錛屽洖鏀墮儴鍒嗚祫婧愶紝淇濊瘉紼嬪簭榪涚▼涓嶈鏉姝匯
2. 閬垮厤寮傛ヤ換鍔$殑闀挎椂闂磋楁椂鎿嶄綔錛屽湪浠誨姟鎵ц岀粨鏉熷悗錛屽強鏃墮噴鏀捐祫婧愩
3 綆$悊Bitmap鍐呭瓨銆
鍦ˋndroid寮鍙戜腑錛屽姞杞戒竴涓鍥劇墖鍒扮晫闈㈠緢瀹規槗錛屼絾濡傛灉涓嬈″姞杞藉ぇ閲忓浘鐗囧氨澶嶆潅澶氫簡銆傚湪寰堝氭儏鍐典笅錛堟瘮濡傦細ListView,GridView鎴朧iewPager錛夛紝鑳藉熸粴鍔ㄧ殑緇勪歡闇瑕佸姞杞界殑鍥劇墖鍑犱箮鏄鏃犻檺澶氱殑銆
鏈変簺緇勪歡鐨刢hild view鍦ㄤ笉鏄劇ず鏃朵細鍥炴敹錛屽苟寰鐜浣跨敤錛屽傛灉娌℃湁浠諱綍瀵筨itmap鐨勬寔涔呭紩鐢ㄧ殑璇濓紝鍨冨溇鍥炴敹鍣ㄤ細閲婃斁浣犲姞杞界殑bitmap銆傝繖娌′粈涔堥棶棰橈紝浣嗗綋榪欎簺鍥劇墖鍐嶆℃樉紺虹殑鏃跺欙紝瑕佹兂閬垮厤閲嶅嶅勭悊榪欎簺鍥劇墖錛屼粠鑰岃揪鍒板姞杞芥祦鐣呯殑鏁堟灉錛屽氨瑕佷嬌鐢ㄥ唴瀛樼紦瀛樺拰鏈鍦扮紦瀛樹簡錛岃繖浜涚紦瀛樺彲浠ヨ╀綘蹇閫熷姞杞藉勭悊榪囩殑鍥劇墖銆
3.1 鍐呭瓨緙撳瓨
鍐呭瓨緙撳瓨浠ョ壓鐗插唴瀛樼殑浠d環錛屽甫鏉ュ揩閫熺殑鍥劇墖璁塊棶銆侺ruCache綾伙紙API Level 4涔嬪墠鍙浠ヤ嬌鐢⊿upport Library錛夐潪甯擱傚悎鍥劇墖緙撳瓨浠誨姟錛屽湪涓涓狶inkedHashMap涓淇濆瓨鐫瀵笲itmap鐨勫己寮曠敤錛屽綋緙撳瓨鏁伴噺瓚呰繃瀹瑰櫒瀹歸噺鏃訛紝鍒犻櫎鏈榪戞渶灝戜嬌鐢ㄧ殑鎴愬憳錛圠RU錛夈
娉ㄦ剰錛氬湪榪囧幓錛岄潪甯告祦琛岀敤SoftReference鎴朩eakReference鏉ュ疄鐜板浘鐗囩殑鍐呭瓨緙撳瓨錛屼絾鐜板湪涓嶅啀鎺ㄨ崘浣跨敤榪欎釜鏂規硶浜嗐傚洜涓轟粠Android 2.3 錛圓PI Level 9錛変箣鍚庯紝鍨冨溇鍥炴敹鍣ㄤ細鏇寸Н鏋佺殑鍥炴敹soft/weak鐨勫紩鐢錛岃繖灝嗗艱嚧浣跨敤soft/weak寮曠敤鐨勭紦瀛樺嚑涔庢病鏈夌紦瀛樻晥鏋溿傞『甯︿竴鎻愶紝鍦ˋndroid3.0錛圓PI Level 11錛変互鍓嶏紝bitmap鏄鍌ㄥ瓨鍦╪ative 鍐呭瓨涓鐨勶紝鎵浠ョ郴緇熶互涓嶅彲棰勮佺殑鏂瑰紡鏉ラ噴鏀綽itmap錛岃繖鍙鑳戒細瀵艱嚧鐭鏃墮棿瓚呰繃鍐呭瓨闄愬埗浠庤岄犳垚宕╂簝銆 鏀惰搗