2013-07-28 3 views
0

J'ai un CycleActivity abstrait qui étend l'activité. J'ai aussi quelques autres activités qui prolongent CycleActivity. Lorsque l'une des activités est créée que je reçois:StackOverFlowError lors de la création d'une activité héritée

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) 

Quelle est la raison de ce comportement?

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

Publiez votre code Activités héritées. – Desert

+0

l'exception est levée à super.onCreate –

Répondre

3

Vous avez une chose de référence circulaire se passe ici. Votre CycleActivity crée une GameActivity et vice versa, par conséquent vous n'avez plus de pile en raison de la récursion infinie.

+0

Quelle partie du code provoque la récursivité? –

+1

@Gospo en supposant que 'GameActivity' étend' CycleActivity' puis 'CycleActivity.onCreate (Bundle, GameState, Classe )' appelle 'GameActivity.onCreate (Bundle)' qui appelle à nouveau l'ancien – kiheru

+0

ohhh ouais, c'était supposé être super. onCreate(), mon mal, merci –

Questions connexes