0

〜150のeditTextを含むレイアウトと、これらの各editTextのonClickListenerを持つmainActivityと、それらすべてをループしてクリアするボタンを持つアプリケーションがあります。

アプリケーションは正常に実行されていましたが、大きな変更を加えることなく、アプリケーションを起動するたびに次の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("");
        }
    }
    }
4

2 に答える 2

1

EditTextごとにonTouch()メソッドを使用する代わりに、switchステートメントを使用して、EditTextIDを使用してEditTextごとにケースを作成します。

public boolean onTouch(View v, MotionEvent event) {
        switch(v.getId())
        {
            case R.id.editTextID:
                //Do something, etc
        } 
        return false;
    }
于 2012-11-23T00:55:15.200 に答える
1

@ alex.veprikが述べたように、 1つ OnClickListenerを使用して、すべてのオブジェクトに割り当ててみてくださいEditTextOnClickListenerすべてのオブジェクトに対して新しいオブジェクトを作成する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-objectsの作成をループに入れ、すべてのボックスのリストのみをメンバー変数に格納することも賢明かもしれません。したがって、150個の変数を使用する代わりに、リストに必要な変数は1つだけで、同時にすべての参照を保持します。(これはメモリの問題には影響しませんが、優れたコードスタイルです)

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

@zaplが推奨しているように、メモリプロファイラーを使用するのも良いかもしれません。

于 2012-11-23T00:58:17.880 に答える