1. 程式人生 > >Android中如何避免OOM 異常

Android中如何避免OOM 異常

OOM 記憶體溢位,想要避免OOM 異常首先我們要知道什麼情況下會導致OOM 異常。


1、圖片過大導致OOM
Android 中用bitmap 時很容易記憶體溢位, 比如報如下錯誤:
Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
解決方法:
方法1: 等比例縮小圖片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
//Options 只儲存圖片尺寸大小,不儲存圖片到記憶體
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);
//回收
bmp.recycle();//
以上程式碼可以優化記憶體溢位,但它只是改變圖片大小,並不能徹底解決記憶體溢位。
方法2:對圖片採用軟引用,及時地進行recyle()操作
SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){
	if(bitmap.get() != null && !bitmap.get().isRecycled()){
	bitmap.get().recycle();
	bitmap = null;
	}
}
方法3:使用載入圖片框架處理圖片,如專業處理載入圖片的ImageLoader 圖片載入框架。
還有我們學的XUtils 的BitMapUtils 來做處理。


2、介面切換導致OOM
一般情況下,開發中都會禁止橫屏的。因為如果是來回切換話,activity 的生命週期會重新銷燬然後建立。
有時候我們會發現這樣的問題,橫豎屏切換N 次後OOM 了。
這種問題沒有固定的解決方法,但是我們可以從以下幾個方面下手分析。
1、看看頁面佈局當中有沒有大的圖片,比如背景圖之類的。
去除xml 中相關設定,改在程式中設定背景圖(放在onCreate()方法中):
Drawable drawable = getResources().getDrawable(R.drawable.id);
ImageView imageView = new ImageView(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。
為什麼要使用convertView?
當convertView為空時,用setTag()方法為每個View繫結一個存放控制元件的ViewHolder物件。當convertView不為空,重複利用已經建立的view的時候,使用getTag()方法獲取繫結的ViewHolder物件,這樣就避免了findViewById 對控制元件的層層查詢,而是快速定位到控制元件。


5、Bitmap 物件不再使用時呼叫recycle()釋放記憶體
有時我們會手工的操作Bitmap 物件,如果一個Bitmap 物件比較佔記憶體,當它不再被使用的時候,可以呼叫Bitmap.recycle()方法回收此物件的畫素所佔用的記憶體,但這不是必須的,視情況而定。


6、其他
Android 應用程式中最典型的需要注意釋放資源的情況是在Activity 的生命週期中,在onPause()、onStop()、onDestroy()方法中需要適當的釋放資源的情況。使用廣播沒有登出也會產生OOM。

相關推薦

Android如何避免OOM 異常

OOM 記憶體溢位,想要避免OOM 異常首先我們要知道什麼情況下會導致OOM 異常。 1、圖片過大導致OOM Android 中用bitmap 時很容易記憶體溢位, 比如報如下錯誤: Java.lang.OutOfMemoryError : bitmap size exce

Android常見的異常

空指標異常 這個是新手最容易碰到的異常,但是也是最容易解決的異常,沒有之一 'java.lang.NullPointerException': Attempt to invoke virtual method 'void android.widget.TextView.

Android如何避免OOM總結

前面介紹了一些基礎的記憶體管理機制以及OOM的基礎知識,那麼在實踐操作當中,有哪些指導性的規則可以參考呢?歸納下來,可以從四個方面著手,首先是減小物件的記憶體佔用,其次是記憶體物件的重複利用,然後是避免物件的記憶體洩露,最後是記憶體使用策略優化。 1)使用更加輕量的資料結構

androidOOM問題 解決原則

只要你記住下面幾個原則,在android 中處理圖片的OOM問題絕對是easy之極: 1.超大圖片要按比例壓縮之後才做顯示,退出當前activity 必須回收   [java] view plaincopy public static B

[Android UI開發] Android處理崩潰異常

大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程式釋出出去之後,如果出現了崩潰現象,開發者應該及時獲取在該裝置上導致崩潰的資訊,這對於下一個版

Android處理崩潰異常

大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程式釋出出去之後,如果出現了崩潰現象,開發者應該及時獲取在該裝置上導致崩潰的資訊,這對於下一個版本的b

Android出來崩潰異常捕獲

現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯。 這對於下一個版本的bug修復幫助極大,所以今天就來介紹一下如何在程式崩潰的情況下收集相關的裝置引數資訊和具體的異常資訊

如何在Android避免建立不必要的物件

在程式設計開發中,記憶體的佔用是我們經常要面對的現實,通常的記憶體調優的方向就是儘量減少記憶體的佔用。這其中避免建立不必要的物件是一項重要的方面。 Android裝置不像PC那樣有著足夠大的記憶體,而且單個App佔用的記憶體實際上是比較小的。所以避免建立

android 處理崩潰異常並重啟程式

有時候由於測試不充分或者程式潛在的問題而導致程式異常崩潰,這個是令人無法接受的,在Android中怎樣捕獲程式的異常崩潰,然後進行一些必要的處理或重新啟動 應用這個問題困惱了我很久,今天終於解決了該問題,寫篇文章記錄一下。 首先捕獲程式崩潰的異常就必須瞭解一下Java

Android實戰】Android處理崩潰異常

public class MainActivity extends ActionBarActivity { public CrashApplication application; @Override protected void onCreate(Bundle

Android處理崩潰異常(存到本地)

同時推薦一款第三方的Crash工具  https://bugly.qq.com 大家都知道,現在安裝Android系統的手機版本和裝置千差萬別,在模擬器上執行良好的程式安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有裝置逐個除錯,所以在程

7.如何避免OOM異常

1)什麼是OOM? OOM,全稱“Out Of Memory”,翻譯成中文就是“記憶體用完了”,來源於java.lang.OutOfMemoryError。 2)為什麼會OOM? 為什麼會沒有記憶體了呢?原因不外乎有兩點: 1)分配的少了:比如虛擬機器本身可使用的記

Android內存泄露與如何有效避免OOM總結

ignore create ui線程 nbsp weak solver 部分 ont 占用 一、關於OOM與內存泄露的概念 我們在Android開發過程中經常會遇到OOM的錯誤,這是因為我們在APP中沒有考慮dalvik虛擬機內存消耗的問題。 1

android異常oom和memory leak

Oom:記憶體溢位 Memory leak:記憶體洩露 記憶體溢位----指的是記憶體不夠用,就會出現oom異常 記憶體洩露----指的是程式設計師自己忘記釋放資源的時候以及管理記憶體的時候,搞不好

Android記憶體洩漏與OOM避免措施總結

文章部落格地址:http://blog.csdn.net/gjnm820/article/details/51579080 一、關於OOM與記憶體洩露的概念 我們在Android開發過程中經常會遇到OOM的錯誤,這是因為我們在APP中沒有考慮dalvi

Android避免OOM(記憶體優化)

Android記憶體優化是效能優化很重要的一部分,而如何避免OOM又是記憶體優化的核心。 Android記憶體管理機制 android官網有一篇文章 Android是如何管理應用的程序與記憶體分配 Android系統的Dalvik虛擬機器扮演了記憶體垃圾自動回收的角色。

如何在Spring MVC 用MockMcv Test避免”Circular view path” 異常

1. 問題的現象 @Configuration @EnableWebMvc //啟用SpringMVC @ComponentScan("spittr.web") public class WebConfig extends WebMvcConfigurerAdapter

Android開發的常見異常

         *******************************************************************************************

Android RecyclerView瀑布流Item寬度異常的問題(原始碼分析)

問題描述 通過RecyclerView配合StaggeredGridLayoutManager可以很方便的實現瀑布流效果,一般情況下會把作為Item的子View寬度設定為MATCH_PARENT,那麼子View將根據列數(假定是垂直排列)平均分配Recycle

android常見異常(OOM異常)

 首先,OOM就是記憶體溢位,即Out Of Memory。也就是說記憶體佔有量超過了VM所分配的最大。     怎麼解決OOM,通常OOM都發生在需要用到大量記憶體的情況下(建立或解析Bitmap,