Java 使用许多EditText和OnClick侦听器时内存不足
我有一个应用程序,它有一个约150个editText的布局和一个mainActivity,其中每个editText都有一个onClickListener,还有一个按钮,可以循环并清除所有editText 该应用程序运行良好,没有进行任何重大更改,现在每次启动该应用程序时都会出现以下logCat错误:Java 使用许多EditText和OnClick侦听器时内存不足,java,android,memory,memory-management,Java,Android,Memory,Memory Management,我有一个应用程序,它有一个约150个editText的布局和一个mainActivity,其中每个editText都有一个onClickListener,还有一个按钮,可以循环并清除所有editText 该应用程序运行良好,没有进行任何重大更改,现在每次启动该应用程序时都会出现以下logCat错误: Out of memory on a 2903056-byte allocation. 我在这里做的任何明显的不良行为都会导致记忆丧失吗 下面是我的一些代码作为示例(这显然重复了很多次) 还有一些
Out of memory on a 2903056-byte allocation.
我在这里做的任何明显的不良行为都会导致记忆丧失吗
下面是我的一些代码作为示例(这显然重复了很多次)
还有一些按钮单击侦听器,它们会引发一些循环
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("");
}
}
}
btnClear.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
透明板();
}
});
公共空白结算板(){
最终整数行计数=14;
最终整数列计数=9;
最后的字符串行[]={“01”、“02”、“03”、“04”、“05”、“06”、“07”、“08”、“09”、“10”、“11”、“12”、“13”、“14”、“15”};
最终字符串COLS[]={“01”、“02”、“03”、“04”、“05”、“06”、“07”、“08”、“09”、“10”};
对于(int i=0;i而不是每个EditText都有一个onTouch()方法,使用switch语句使用EditText ID为每个EditText创建一个大小写
public boolean onTouch(View v, MotionEvent event) {
switch(v.getId())
{
case R.id.editTextID:
//Do something, etc
}
return false;
}
正如@alex.veprik提到的:尝试使用一个OnClickListener
,并将其分配给所有EditText
-对象。如果为每个EditText
-对象创建一个新的OnClickListener
,尽管它们都做相同的事情,但这会消耗大量内存
(示例)
正如@zapl所建议的,使用内存探查器也可能很好。2903056字节分配可能不是由EditText
s引起的-使用内存探查器来检查问题所在。此外,ListView
或类似的工具,不需要在代码中包含150个box1234
变量。T请尝试对所有EditText对象仅使用一个OnClickListener。只需在其中放置一个开关盒,并在其中处理不同的调用者(EditText)。这将消除150个视图对象。OnClickListener().第二,在eclipse中清理并重新构建您的项目。有时候,eclipse会对您的包执行奇怪的操作,因此它的行为会很奇怪。我同意@alex.veprik,但我不明白为什么您希望在单个活动中使用这么多。我不知道您的程序是什么,所以它可能是有效的,但对于这么多的程序,用户似乎很难处理,也很难使用如果可能的话,你可以考虑把它们分开……只是一个想法。
public boolean onTouch(View v, MotionEvent event) {
switch(v.getId())
{
case R.id.editTextID:
//Do something, etc
}
return false;
}
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);
}
List<EditText> boxes = new ArrayList<EditText>();
for (int i = 0; i < NBR_OF_BOXES; i++) {
boxes.add(new EditText());
}