2013-07-28 2 views
0

У меня есть абстрактная CycleActivity, которая расширяет Activity. У меня также есть несколько других действий, которые расширяют CycleActivity. Когда один из видов деятельности создается я получаю:StackOverFlowError при создании унаследованной активности

07-28 19:42:20.850: E/AndroidRuntime(21162): FATAL EXCEPTION: main 
07-28 19:42:20.850: E/AndroidRuntime(21162): java.lang.StackOverflowError 
07-28 19:42:20.850: E/AndroidRuntime(21162): at gospo.plaga.GameActivity.onCreate(GameActivity.java:23) 
07-28 19:42:20.850: E/AndroidRuntime(21162): at gospo.plaga.CycleActivity.onCreate(CycleActivity.java:29) 
07-28 19:42:20.850: E/AndroidRuntime(21162): at gospo.plaga.GameActivity.onCreate(GameActivity.java:23) 
07-28 19:42:20.850: E/AndroidRuntime(21162): at gospo.plaga.CycleActivity.onCreate(CycleActivity.java:29) 
07-28 19:42:20.850: E/AndroidRuntime(21162): at gospo.plaga.GameActivity.onCreate(GameActivity.java:23) 

В чем причина такого поведения?

CycleActivity.java

package gospo.plaga; 

import gospo.plaga.game.Game; 
import gospo.plaga.game.GameState; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 

public abstract class CycleActivity extends Activity 
{ 
private GameState finishAfterGameState; 
private Class<?> nextActivityClass; 
private Timer gameStateChangeHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 

protected void onCreate(Bundle savedInstanceState, 
     GameState finishAfterGameState, Class<?> nextActivityClass) 
{ 
    onCreate(savedInstanceState); 
    this.finishAfterGameState = finishAfterGameState; 
    this.nextActivityClass = nextActivityClass; 

    gameStateChangeHandler = new Timer(); 
    TimerTask gameStateChangeHandlerTask = new TimerTask() 
    { 
     @Override 
     public void run() 
     { 
      handleGameStateChange(); 
     } 
    }; 
    final int GameStateChangeHandlePeriod = 1000;// TODO: 
    gameStateChangeHandler.schedule(gameStateChangeHandlerTask, 0, 
      GameStateChangeHandlePeriod); 

} 

private void handleGameStateChange() 
{ 
    Game game = Game.getInstance(); 

    long finishesAt = 0; 

    GameState[] gameStates = GameState.values(); 
    for (GameState gameState : gameStates) 
    { 
     finishesAt += gameState.getDuration(); 
     if (gameState.equals(finishAfterGameState)) 
     { 
      break; 
     } 
    } 

    if (game.getGameTime() > finishesAt) 
    { 
     gameStateChangeHandler.cancel(); 

     runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Intent intent = new Intent(getApplicationContext(), 
         nextActivityClass); 
       startActivity(intent); 
       finish(); 
      } 
     }); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.result, menu); 
    return true; 
} 
} 

GameActivity.java

... 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState, GameState.Tour, ResultActivity.class); 
... 
+0

Опубликовать свой унаследованный код деятельности. – Desert

+0

исключение бросается на super.onCreate –

ответ

3

У вас есть циклическая ссылка, что здесь происходит. Ваша CycleActivity создает GameActivity и наоборот, поэтому вы исчерпали стек из-за бесконечной рекурсии.

+0

Какая часть кода вызывает рекурсию? –

+1

@Gospo, предполагая, что 'GameActivity' расширяет' CycleActivity', затем 'CycleActivity.onCreate (Bundle, GameState, класс )' вызывает 'GameActivity.onCreate (Bundle)', который снова вызывает бывшее – kiheru

+0

ohhh yeah, который должен был быть супер. onCreate(), мой плохой, спасибо –

Смежные вопросы