android 記憶體優化篇

yangxi_001發表於2013-11-27

一、圖片記憶體優化操作:
一般來說,我們對圖片進行操作比較多的就是setImageBitmap、setImageResource,這些都是通過BitmapFactory.decodeResource來獲取點陣圖,現在發現當程式需要用到的圖片較多時候,容易產生oom,因為這些法在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體。
現在推薦大家改用先通過BitmapFactory.decodeStream方法,建立出一個bitmap,再將其設為ImageView的source,因為decodeStream最大的祕密在於其直接呼叫JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。當然如果在讀取時加上圖片的Config引數,可以更有效的減少載入的記憶體,從而更有效阻止丟擲記憶體異常。另外,decodeStream直接拿圖片來讀取位元組碼了,不會根據機器的各種解析度來自動適應,使用了decodeStream之後,需要在hdpi和mdpi,ldpi中配置相應的圖片資源,否則在不同解析度機器上都是同樣大小(畫素點數量),顯示出來的大小就不對了。
示例:
/**
*以最省記憶體的方式讀取本地資源的圖片
*@paramcontext
*@paramresId
*@return
*/
public static readBitMap(Context context,int resId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//獲取資源圖片
InputStreamis=context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
注:
1、opt.inPurgeable=true; //為True的話表示使用BitmapFactory建立的Bitmap用於儲存Pixel的記憶體空間在系統記憶體不足時可以被回收,在應用需要再次訪問Bitmap的Pixel時(如繪製Bitmap或是呼叫getPixel),系統會再次呼叫BitmapFactory decoder重新生成Bitmap的Pixel陣列。為了能夠重新解碼影象,bitmap要能夠訪問儲存Bitmap的原始資料。
2、options.inJustDecodeBounds=false;
3、options.inSampleSize=10;//這個值越大表示圖片質量越差,這個10表示長寬為原來圖片的10分之一。

二、優化Dalvik虛擬機器的堆記憶體分配。
對於Android平臺來說,其託管層使用的DalvikJavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型遊戲或耗資源的應用中可能考慮手動干涉GC處理,使用dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程式堆記憶體的處理效率。使用方法:
privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
或者:
privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//設定最小heap記憶體為6MB大小

相關文章