盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設定一張大圖,
因為這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體。
是以,改用先通過BitmapFactory.decodeStream方法,建立出一個bitmap,再将其設為ImageView的 source,decodeStream最大的秘密在于其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,進而節省了java層的空間。
如果在讀取時加上圖檔的Config參數,可以跟有效減少加載的記憶體,進而跟有效阻止抛out of Memory異常
另外,decodeStream直接拿的圖檔來讀取位元組碼了, 不會根據機器的各種分辨率來自動适應, 使用了decodeStream之後,需要在hdpi和mdpi,ldpi中配置相應的圖檔資源, 否則在不同分辨率機器上都是同樣大小(像素點數量),顯示出來的大小就不對了。
另外,以下方式也大有幫助:
| |
| |
以下奉上一個方法:
``java
public static Bitmap readBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//擷取資源圖檔
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
| |
通過上面的方式解決了,但是這并不是最完美的解決方式。
通過一些了解,得知如下:
優化Dalvik虛拟機的堆記憶體配置設定
對于Android平台來說,其托管層使用的Dalvik JavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型遊戲或耗資源的應用中可能考慮手動幹涉GC處理,使用dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程式堆記憶體的處理效率。當然具體原理我們可以參考開源工程,這裡我們僅說下使用方法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程式onCreate時就可以調用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);即可。
Android堆記憶體也可自己定義大小
對于一些Android項目,影響性能瓶頸的主要是Android自己記憶體管理機制問題,目前手機廠商對RAM都比較吝啬,對于軟體的流暢性來說RAM對性能的影響十分敏感,除了 優化Dalvik虛拟機的堆記憶體配置設定外,我們還可以強制定義自己軟體的對記憶體大小,我們使用Dalvik提供的dalvik.system.VMRuntime類來設定最小堆記憶體為例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //設定最小heap記憶體為6MB大小。當然對于記憶體吃緊來說還可以通過手動幹涉GC去處理
bitmap 設定圖檔尺寸,避免 記憶體溢出 OutOfMemoryError的優化方法
★android 中用bitmap 時很容易記憶體溢出,報如下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget
● 主要是加上這段:
| |
● eg1:(通過Uri取圖檔)
| |
以上代碼可以優化記憶體溢出,但它隻是改變圖檔大小,并不能徹底解決記憶體溢出。
● eg2:(通過路徑去圖檔)
| |
原文作者: CrazyBirds
原文位址: http://my.eoe.cn/littlebirds/archive/4646.html