2016-07-22 31 views
2

Ich habe Probleme bei der Implementierung eines Handlers für eine Verzögerungsfunktion. Dies soll ein einfaches Würfelspiel sein.Android-Handler warten/Schlaf funktioniert nicht

Wenn der Computer an der Reihe ist, um die Würfel zu werfen, sollte zwischen jedem Wurf eine Pause sein, damit der Benutzer sehen kann, was der Computer gerollt hat. Wenn ich den Code ausführe, sollte er 2 Sekunden warten, bevor er erneut läuft. Das passiert nicht.

Dies ist meine erste Post auf Stackoverflow. Irgendwelche Vorschläge sind willkommen.

Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
    timerHandler.postDelayed(this, 2000); //delay run for 2 seconds 
    } 
}; 

public void computerTurn() { 
    rollButton.setEnabled(false); //disable UI for cpu's turn 
    holdButton.setEnabled(false); 
    ImageView diceImg = (ImageView) findViewById(R.id.dicePic); 
    Random r = new Random(); 

    diceRoll = r.nextInt(6) + 1; 
    switch (diceRoll) { 
    case 1: 
     compTurnScore = 0; 
     diceImg.setImageResource(R.drawable.dice1); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    case 2: ... 
    case 3: ... 
    case 4: ... 
    case 5: ... 
    case 6: 
     compTurnScore += 6; 
     diceImg.setImageResource(R.drawable.dice6); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    } 

    timerHandler.postDelayed(timerRunnable, 0); //run the timerhandler without any delay 
    if(compTurnScore < 20) //if cpu rolls less than 20 keep rolling 
    computerTurn(); 
} 
+0

Probieren Sie 'Thread.sleep (2000)' –

+0

Innerhalb 'timerRunnable', entfernen Sie' timerHandler.postDelayed (this, 2000); // verzögerungslauf für 2 sekunden' und setze 'if (compTurnScore <20) // wenn cpu weniger als 20 würfelt rolle computerTurn();' Und rufe 'timerHandler.postDelayed (timerRunnable, 2000);' –

Antwort

0

Wie ich es korrigieren Sie computerTurn() so ausgeführt werden soll, dass, wenn würfeln geschieht sollte es nur mit dealy gezeigt werden, wenn ein anderer computerTurn() Bedürfnisse (Bedingung compTurnScore < 20) aufgerufen werden.

Wenn Sie Handler s verwenden möchten, würde ich vorschlagen, es als "rufen Sie computerTurn() in einer verzögerten Art und Weise von Handler". Code würde wie folgt (basierend auf dem Original-Code) sein:

Handler timerHandler = new Handler(); // Created in Main thread thus handled in Main thread 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
    computerTurn(); // Called in Main thread 
    } 
}; 

public void computerTurn() { 
    rollButton.setEnabled(false); //disable UI for cpu's turn 
    holdButton.setEnabled(false); 
    ImageView diceImg = (ImageView) findViewById(R.id.dicePic); 
    Random r = new Random(); 

    diceRoll = r.nextInt(6) + 1; 
    switch (diceRoll) { 
    case 1: 
     compTurnScore = 0; 
     diceImg.setImageResource(R.drawable.dice1); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    case 2: ... 
    case 3: ... 
    case 4: ... 
    case 5: ... 
    case 6: 
     compTurnScore += 6; 
     diceImg.setImageResource(R.drawable.dice6); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    } 

    if(compTurnScore < 20) { //if cpu rolls less than 20 keep rolling 
    timerHandler.postDelayed(timerRunnable, 2000); //request another round of computerTurn() to be called after 2 sec 
    } 
} 

Bitte beachten Sie, dass einige undichte ein, um sich für computerTurn() sein könnte zum Zeitpunkt aufgerufen werden, wenn Activity oder Fragment Kontext nicht mehr vorhanden sein könnten. Folgen Sie anderen Posts, um zu überprüfen, ob Activity oder Fragment noch im Status ist, damit Sie sicher auf seine Ansichten zugreifen können.

+0

Danke für die Antwort. Das hat genau so funktioniert, wie ich es wollte. – ImTheRealOne