鏈接:http://blog.csdn.net/u010375364/article/details/51932688
想要避免 OOM 異常首先我們要知道什么情況下會導致 OOM 異常。
1、圖片過大導致 OOM
Android 中用 bitmap 時很容易內存溢出,比如報如下錯誤:Java.lang.OutOfMemoryError : bitmap size
exceeds VM budget。
解決方法:
方法 1: 等比例縮小圖片
? ? ? ? BitmapFactory.Options options =newBitmapFactory.Options();
? ? ? ? options.inSampleSize = 2;
? ? ? ? ?//Options只保存圖片尺寸大小,不保存圖片到內存
? ? ? ? ?BitmapFactory.Optionsopts=newBitmapFactory.Options();
? ? ? ? ?opts.inSampleSize = 2;
? ? ? ? ?Bitmap bmp =null;
? ? ? ? ?bmp = BitmapFactory.decodeResource(getResources(),?mImageIds[position],opts);
? ? ? ? ?//回收
? ? ? ? ?bmp.recycle();//
以上代碼可以優化內存溢出,但它只是改變圖片大小,并不能徹底解決內存溢出。
方法 2:對圖片采用軟引用,及時地進行 recyle()操作
? ? ? ? ? SoftReferencebitmap=newSoftReference(pBitmap);
? ? ? ? ? if(bitmap !=null){
? ? ? ? ? ? ? ? ? if(bitmap.get() !=null&& !bitmap.get().isRecycled()){
? ? ? ? ? ? ? ? ? ? ? ? bitmap.get().recycle();
? ? ? ? ? ? ? ? ? ? ? ? bitmap =null;
? ? ? ? ? ? ? ? ? }
? ? ? ? }
2、界面切換導致 OOM
有時候我們會發現這樣的問題,橫豎屏切換 N 次后 OOM 了。
這種問題沒有固定的解決方法,但是我們可以從以下幾個方面下手分析。
1)、看看頁面布局當中有沒有大的圖片,比如背景圖之類的。
去除 xml 中相關設置,改在程序中設置背景圖(放在 onCreate()方法中):
? ? ? ? ? Drawable drawable = getResources().getDrawable(R.drawable.id);
? ? ? ? ? ImageView imageView =newImageView(this);
? ? ? ? ? imageView.setBackgroundDrawable(drawable);
在 Activity destory 時注意,drawable.setCallback(null);防止 Activity 得不到及時的釋放。
2)、 跟 上 面 方 法 相 似 , 直 接 把 xml 配 置 文 件 加 載 成 view 再 放 到 一 個 容 器 里 , 然 后 直 接 調 用
this.setContentView(View view);方法,避免 xml 的重復加載。
3)、 在頁面切換時盡可能少地重復使用一些代碼
比如:重復調用數據庫,反復使用某些對象等等......
常見的內存使用不當的情況
3、查詢數據庫沒有關閉游標
程序中經常會進行查詢數據庫的操作,但是經常會有使用完畢 Cursor 后沒有關閉的情況。如果我們的查詢結果集比較小,對內存的消耗不容易被發現,只有在常時間大量操作的情況下才會出現內存問題,這樣就會給以后的測試和問題排查帶來困難和風險。
4、構造 Adapter 時,沒有使用緩存的 convertView
在使用 ListView 的時候通常會使用 Adapter,那么我們應該盡可能的使用 ConvertView。
5、Bitmap 對象不再使用時調用 recycle()釋放內存
有時我們會手工的操作 Bitmap 對象,如果一個 Bitmap 對象比較占內存,當它不再被使用的時候,可以調用Bitmap.recycle()方法回收此對象的像素所占用的內存,但這不是必須的,視情況而定。
6、其他
Android 應用程序中最典型的需要注意釋放資源的情況是在 Activity 的生命周期中,在 onPause()、onStop()、onDestroy()方法中需要適當的釋放資源的情況。