Out of Memory错误 - 可能是由于内存泄漏?

时间:2015-10-26 17:41:01

标签: java android memory memory-leaks out-of-memory

所以我在使用android模拟器时遇到了代码问题。我得到相同的错误:抛出OutOfMemoryError“无法分配4776816字节分配2473998空闲字节和2MB直到OOM” 我有一种感觉这是由于内存泄漏,因为我为每个类中的每个类创建对象,我想它会导致某种循环错误。这在Java中是不允许的吗?任何帮助将不胜感激..

以下是代码:

"MyArray"

玩家类:

select * from tablename ORDER By ID ASC

移动课程:

public class BoardActivity extends AppCompatActivity {

Move move = new Move();
Button buttons[] = new Button[16];

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_board);

    move.newGame();


    buttons[0] = (Button)findViewById(R.id.button1);buttons[0].setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
           move.makeMove(move.cups.get(0));
            updateButtons();
        }});
    buttons[1] = (Button)findViewById(R.id.button2);buttons[1].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(1));
            updateButtons();
        }
    });
    buttons[2] = (Button)findViewById(R.id.button3);buttons[2].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(2));
            updateButtons();
        }
    });
    buttons[3] = (Button)findViewById(R.id.button4);buttons[3].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(3));
            updateButtons();
        }
    });
    buttons[4] = (Button)findViewById(R.id.button5);buttons[4].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(4));
            updateButtons();
        }
    });
    buttons[5] = (Button)findViewById(R.id.button6);buttons[5].setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
            move.makeMove(move.cups.get(5));
            updateButtons();
        }
    });
    buttons[6] = (Button)findViewById(R.id.button7);buttons[6].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(6));
            updateButtons();
        }
    });
    buttons[7] = (Button)findViewById(R.id.button8);buttons[7].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            updateButtons();
        }
    });
    buttons[8] = (Button)findViewById(R.id.button9);buttons[8].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(8));
            updateButtons();
        }
    });
    buttons[9] = (Button)findViewById(R.id.button10);buttons[9].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(9));
            updateButtons();
        }
    });
    buttons[10] = (Button)findViewById(R.id.button11);buttons[10].setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
            move.makeMove(move.cups.get(10));
            updateButtons();
        }
    });
    buttons[11] = (Button)findViewById(R.id.button12);buttons[11].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(11));
            updateButtons();
        }
    });
    buttons[12] = (Button)findViewById(R.id.button13);buttons[12].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
             move.makeMove(move.cups.get(12));
            updateButtons();
        }
    });
    buttons[13] = (Button)findViewById(R.id.button14);buttons[13].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(13));
            updateButtons();
        }
    });
    buttons[14] = (Button)findViewById(R.id.button15);buttons[14].setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            move.makeMove(move.cups.get(14));
            updateButtons();
        }
    });
    // Still have bug with this button - needs to be sorted
    buttons[15] = (Button)findViewById(R.id.button16);buttons[15].setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
            updateButtons();
        }
    });

    updateButtons();
}


public void updateButtons(){
    for(int i=0; i<buttons.length; i++){
        buttons[i].setText(move.cups.get(i).toString());
    }
}
}

1 个答案:

答案 0 :(得分:1)

您的内存不足,因为您的代码将以递归方式运行并创建无数个BoardActivityMovePlayer的对象。

如何?好吧,当初始化BoardActivity类时,行

Move move = new Move();

将创建新的Move对象。这反过来将导致执行行

Player player = new Player();

来自Move类。这将生成一个包含行

的新Player对象
BoardActivity board = new BoardActivity();

现在这将创建另一个BoardActivity对象,这将我们带回到开始,创建一个无休止的对象产生周期。

简单地说,BoardActivity - &gt; Move->Player - &gt; BoardActivity - &gt; Move - &gt; Player ....

我猜测AppCompatActivity是一个Android活动。 Android活动相当繁重,并在初始化时分配了大量的堆内存。这就是为什么你这么快就耗尽内存的原因。

您不应该以这种方式创建活动。创建一个并从主活动开始,或使用AndroidManifest

将其加载为默认活动

此外,不是为每个按钮创建单独的OnClickListener,而是使用if语句创建单个OnClickListener和检查按钮ID以确定单击了哪个按钮。