Мне нужно добавить искусственную паузу перед тем, как мой ИИ сыграет свою очередь на доске крестики-нолики. Однако, когда я пытаюсь использовать что-то вроде Thread.sleep в том месте, где у меня есть комментарий, вся функция onClick тормозит. Под задержкой я подразумеваю то, что ((Button) v) .setText ("0") не устанавливает для текста кнопки значение 0 на время, в течение которого я использую функцию сна, и в тот момент, когда таймер сработает, все происходит немедленно. Это похоже на задержку в начале функции, а не в середине, где находится комментарий. Есть ли способ решить эту проблему или объяснить, почему функция сна не отстает там, где она должна быть?
public void onClick(View v) {
if (!((Button) v).getText().toString().equals("")){
return;
}
((Button) v).setText("0");
turn();
// Need a pause before tictacAI does anything
tictacAI("0", "X").setText("X");
turn();
if (won){
resetBoard();
won = false;
}
}




При использовании Thread.sleep в onClick вы фактически блокируете весь UI поток. Это предотвратит перерисовку вашего представления Android Framework, поэтому ваше изменение свойства View не будет отображаться.
Чтобы отложить выполнение, вы должны использовать View.postDelayed, который отправит ваше действие в очередь сообщений и выполнит его позже.
public void onClick(View v) {
if (!((Button) v).getText().toString().equals("")){
return;
}
((Button) v).setText("0");
turn();
// Need a pause before tictacAI does anything
v.postDelayed(new Runnable() {
@Override
public void run() {
tictacAI("0", "X").setText("X");
turn();
if (won){
resetBoard();
won = false;
}
}
}, 1000L); //wait 1 second
}
Если вы используете Java 1.8, вы можете использовать лямбда вместо анонимного класса.
Другое примечание:
этот Runnable не будет собираться мусором до тех пор, пока не будет выполнен, поэтому длинный интервал может привести к утечке всего вашего представления, то есть очень плохой. Рассмотрите возможность использования View.removeCallbacks, когда этот обратный вызов больше не нужен (например, onDestroy активности)
Затем сделайте v final, если вы не пишете что-то вроде v = ...., final v подойдет.
Как насчет того, чтобы сделать паузу между функцией tictacAI и функцией поворота? Я снова попытался использовать v.postDelayed, но для этого мне нужно было сделать v конечной переменной. Как мне вложить еще один постDelayed в предложенный вами postDelayed? Спасибо! @ZumiKua