2016-07-22 4 views
2

У меня возникли проблемы с внедрением обработчика функции задержки. Предполагается, что это простая игра в кости.android handler wait/sleep не работает

Когда очередь компьютера поворачивает кубик, предполагается, что между каждым рулоном будет пауза, чтобы пользователь мог видеть, что компьютер скатился. Когда я запускаю код, он должен дождаться 2 секунд перед повторным запуском. Этого не происходит.

Это мое первое сообщение о stackoverflow. Любые предложения приветствуются.

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

Попробуйте 'Thread.sleep (2000)' –

+0

Внутри 'timerRunnable', удалите' timerHandler.postDelayed (это, 2000); // задержка запуска в течение 2 секунд' и put 'if (compTurnScore <20) // если cpu rolls меньше 20, продолжайте катить computerTurn();' И вызовите 'timerHandler.postDelayed (timerRunnable, 2000);' –

ответ

0

Как я это правильно, вы хотите, чтобы computerTurn() выполнена таким образом, что, если кости прокатки происходит это должно быть показано Dealy только если другой computerTurn() должна быть вызвана (состояние compTurnScore < 20).

Если вы хотите использовать Handler s, я бы предложил просмотреть его как «давайте позвоним computerTurn() с задержкой от Handler». Код будет что-то вроде этого (на основе исходного кода):

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 
    } 
} 

Пожалуйста, обратите внимание, что некоторые утечки могут быть в порядке здесь computerTurn() можно назвать в то время, когда Activity или Fragment контекст не может присутствовать больше. Следуйте другим сообщениям о том, как проверить, находится ли Activity или Fragment, чтобы вы могли безопасно обращаться к его представлениям.

+0

Спасибо за ответ. Это работало именно так, как я хотел. – ImTheRealOne