使用许多editTexts和onclicklisteners耗尽内存

时间:2012-11-23 00:42:31

标签: java android memory memory-management

我有一个应用程序,其布局包含~150 editText和一个mainActivity,每个editTexts都有一个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("");
        }
    }
    }

2 个答案:

答案 0 :(得分:1)

不使用每个EditText的onTouch()方法,而是使用switch语句为每个EditText创建一个案例,使用EditText ID

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

答案 1 :(得分:1)

正如@ alex.veprik所提到的:尝试使用一个 OnClickListener,并将其分配给所有EditText - 对象。如果你为每个OnClickListener - 对象创建一个新的EditText,虽然它们都是这样做的,但这会占用你很多的内存。

实施例)

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 - 对象的创建放在循环中,并且只存储成员变量中所有框的列表也可能是明智之举。因此,您现在只需要一个列表,而不是拥有150个变量,同时保留所有引用。 (这不会影响你的记忆问题,但它的代码风格很好)

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

正如@zapl推荐的那样,使用内存分析器也可能不错。