java - 使用许多 editText 和 onclicklistener 时内存不足

标签 java android memory memory-management

我有一个应用程序,其布局包含约 150 个 editText 和一个 mainActivity,其中每个 editText 都有一个 onClickListener,以及一个循环遍历所有 editText 并清除它们的按钮。

应用程序运行良好,并且没有进行任何重大更改,现在每次启动应用程序时我都会收到以下 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("");
        }
    }
    }

最佳答案

正如 @alex.veprik 提到的:尝试使用 one 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 对象的创建放入循环中,并仅将所有框的列表存储在成员变量中也可能是明智的。因此,您现在只需要一个列表变量,而不是 150 个变量,同时保留所有引用。 (这不会影响你的内存问题,但这是很好的代码风格)

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

正如 @zapl 所建议的,使用内存分析器可能也不错。

关于java - 使用许多 editText 和 onclicklistener 时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521844/

相关文章:

java - For Loop 延迟不工作 Android

debugging - 为什么 "garbage"数据看起来没有意义?

android - 使用数据库中的值填充 EditText

c# - 为简单的 XML 文件转换器使用太多内存

c - 访问数组段错误中的数据

java - 我正在尝试按字典顺序对矩形进行排序。 (x,y,宽度,高度)

java - 想要从我的 java 代码访问 css 样式

java - Android : Socket - java.net.SocketException: sendto 失败: EPIPE (Broken pipe)

android animatorset内存管理,从imageview中释放内存

java.io.EOFException :\n not found: limit=0 content=…