2013-07-28 25 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,Class )'調用'GameActivity.onCreate(Bundle)'這再次調用前者 – kiheru

+0

哦,是的,這應該是超級。 onCreate(),我的不好,謝謝 –