【问题标题】:Running out of memory using many editTexts and onclicklisteners使用许多 editTexts 和 onclicklisteners 内存不足
【发布时间】: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


【解决方案1】:

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

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

正如@zapl 建议的那样,使用内存分析器也可能很好。

【讨论】:

    【解决方案2】:

    不要为每个 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多