Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用许多EditText和OnClick侦听器时内存不足_Java_Android_Memory_Memory Management - Fatal编程技术网

Java 使用许多EditText和OnClick侦听器时内存不足

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. 我在这里做的任何明显的不良行为都会导致记忆丧失吗 下面是我的一些代码作为示例(这显然重复了很多次) 还有一些

我有一个应用程序,它有一个约150个editText的布局和一个mainActivity,其中每个editText都有一个onClickListener,还有一个按钮,可以循环并清除所有editText

该应用程序运行良好,没有进行任何重大更改,现在每次启动该应用程序时都会出现以下logCat错误:

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());
}