【发布时间】:2012-11-23 00:42:30
【问题描述】:
我有一个应用程序,它的布局包含约 150 个 editText 和一个 mainActivity,其中每个 editText 都有一个 onClickListener,以及一个循环遍历它们并清除它们的按钮。
应用程序运行良好,并且没有进行任何重大更改,我现在每次启动应用程序时都会收到以下 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("");
}
}
}
【问题讨论】:
-
2903056 字节分配可能不是由
EditTexts 引起的 - 使用像 MAT 这样的内存分析器来检查问题出在哪里。此外,ListView或类似的东西不需要您的代码中有 150 个box1234变量。 -
尝试对所有 EditText 对象仅使用一个 OnClickListener。只需在里面放一个开关盒并在里面处理不同的调用者(EditText)。它将消除 View.OnClickListener() 的 150 个对象。其次,在 Eclipse 中清理并重新构建您的项目。有时 eclips 会对你的包做一些奇怪的事情,所以它的行为很奇怪。
-
我同意@alex.veprik 的观点,但我不明白为什么你会在一个活动中想要这么多。我不知道你的程序是什么,所以它可能是有效的,但有这么多用户似乎要处理很多并且更难管理代码。如果可能的话,你可以考虑把它们分开......只是一个想法
标签: java android memory memory-management