android 記憶體優化篇
一、圖片記憶體優化操作:
一般來說,我們對圖片進行操作比較多的就是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大小
相關文章
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- Android效能優化之記憶體篇Android優化記憶體
- Android記憶體優化之static使用篇Android記憶體優化
- 記憶體使用總結篇 -- Android 記憶體優化第五彈記憶體Android優化
- Android記憶體優化Android記憶體優化
- Android 記憶體優化Android記憶體優化
- Android效能優化 - 記憶體優化Android優化記憶體
- Android深度效能優化--記憶體優化(一篇就夠)Android優化記憶體
- Android記憶體優化之記憶體快取Android記憶體優化快取
- Android 效能優化之記憶體優化Android優化記憶體
- Android Note - 記憶體優化Android記憶體優化
- Android記憶體優化(一):Java記憶體區域Android記憶體優化Java
- Android記憶體優化之圖片優化Android記憶體優化
- 淺談Android記憶體優化Android記憶體優化
- Android記憶體優化全解析Android記憶體優化
- Android記憶體優化雜談Android記憶體優化
- android,記憶體優化詳解Android記憶體優化
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(上)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(下)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(中)Android優化記憶體
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- Android APP 記憶體優化之圖片優化AndroidAPP記憶體優化
- 讀書筆記2-記憶體優化篇筆記記憶體優化
- Android應用記憶體優化方式Android記憶體優化
- Android記憶體優化(三)避免可控的記憶體洩漏Android記憶體優化
- Android記憶體優化(五)詳解記憶體分析工具MATAndroid記憶體優化
- Android記憶體優化——記憶體洩露檢測分析方法Android優化記憶體洩露
- Android 效能優化(四)之記憶體優化實戰Android優化記憶體
- Android 是如何管理 App 記憶體的 — Android 記憶體優化第二彈AndroidAPP記憶體優化
- Android 是如何管理 App 記憶體的 -- Android 記憶體優化第二彈AndroidAPP記憶體優化
- android效能評測與優化-記憶體Android優化記憶體
- android記憶體管理機制與優化Android記憶體優化
- Android效能優化(三)之記憶體管理Android優化記憶體
- Android效能優化之記憶體洩漏Android優化記憶體
- Android應用優化之記憶體概念Android優化記憶體
- Android 記憶體洩露優化處理Android記憶體洩露優化
- ANDROID記憶體優化(大彙總——上)Android記憶體優化
- ANDROID記憶體優化(大彙總——中)Android記憶體優化