2012-11-23 47 views
0

我有一個應用程序具有約150編輯文本和一個mainActivity的onClickListener爲每個這些editTexts和一個按鈕,通過它們遍歷它們並清除它們。使用許多editTexts和onclicklisteners運行內存不足

應用程序運行良好,並沒有做任何顯著的變化,我現在得到以下logcat的錯誤每次我啓動的應用程序:

Out of memory on a 2903056-byte allocation. 

是否有任何明顯的不良做法,我在這裏做什麼是造成內存丟失?

一些下面我的代碼說明(這是重複顯然很多次)

box0101.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      txtHint.setText(hintPrefix + onOneClick); 
      return false; 
     } 
    }); 
    box0301.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      txtHint.setText(hintPrefix + onOneClick); 
      return false; 
     } 
    }); 
    box0401.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      txtHint.setText(hintPrefix + onOneClick); 
      return false; 
     } 
    }); 
    box0501.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      txtHint.setText(hintPrefix + onOneClick); 
      return false; 
     } 
    }); 
    box0601.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      txtHint.setText(hintPrefix + onOneClick); 
      return false; 
     } 
    }); 

,也掀起了一些循環

btnClear.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      clearBoard();    
     } 
    }); 
    public void clearBoard() { 
    final int ROW_COUNT = 14; 
    final int COL_COUNT = 9; 
    final String ROWS[] = {"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15"}; 
    final String COLS[] = {"01","02","03","04","05","06","07","08","09","10"}; 

    for(int i=0; i<ROW_COUNT; i++) { 
     for(int j=0; j<COL_COUNT; j++) { 
      String a = ROWS[i]; 
      String b = COLS[j]; 
      int editTextId = getResources().getIdentifier("box" + a + b , "id", getPackageName()); 
      EditText et=(EditText)findViewById(editTextId);  
      et.setText(""); 
     } 
    } 
    } 
+0

A 2903056字節分配可能不是由'EditText's造成的 - 使用類似[MAT]的內存分析器(http://android-developers.blogspot.de/2011/03/memory-analysis-for-android。 HTML)來檢查你的問題在哪裏。另外,一個'ListView'或類似的東西,並不需要你的代碼中有150個'box1234'變量。 – zapl

+2

嘗試僅爲所有EditText對象使用一個OnClickListener。只需在裏面放置一個開關盒,並處理不同的調用者(EditText)。它將消除View.OnClickListener()的150個對象。 二,在日食中乾淨和重新構建你的項目。有時候eclip會爲你的包裝做奇怪的事情,所以它很奇怪。 –

+0

我同意@ alex.veprik,但我不明白爲什麼你會希望在單一活動中有這麼多。我不知道你的程序是什麼,所以它可能是有效的,但對於用戶來說,處理和管理代碼似乎很重要。如果可能的話,你可以考慮把它們分開...只是一個想法 – codeMagic

回答

1

As @ alex.veprik提到:嘗試使用一個OnClickListener,並將其分配給所有EditText對象。如果您爲每個EditText對象創建一個新的OnClickListener,儘管它們都是這樣做的,但這會佔用大量的內存。

例)

View.OnTouchListener boxListener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     txtHint.setText(hintPrefix + onOneClick); 
     return false; 
    } 
}); 

//boxes is a list of all your boxes 
for(int i=0; i < boxes.size(); i++) { 
    boxes.get(i).setOnTouchListener(boxListener); 
} 

這也可能是明智的,把你的EditText -objects創建一個循環,並只有所有框列表存儲在一個成員變量。因此,現在只需要一個列表,而不是有150個變量,同時保留所有的引用。 (這不影響你的記憶問題,但它是很好的代碼風格)

List<EditText> boxes = new ArrayList<EditText>(); 
for (int i = 0; i < NBR_OF_BOXES; i++) { 
    boxes.add(new EditText()); 
} 

由於@zapl建議,它也可能是很好的使用內存分析器。

1

取代具有onTouch的一些buttonclick聽衆()方法爲每個EditText,使用switch語句爲每個EditText創建一個案例,使用EditText ID

public boolean onTouch(View v, MotionEvent event) { 
     switch(v.getId()) 
     { 
      case R.id.editTextID: 
       //Do something, etc 
     } 
     return false; 
    }