Функция сна не отстает перед ходом ИИ

Мне нужно добавить искусственную паузу перед тем, как мой ИИ сыграет свою очередь на доске крестики-нолики. Однако, когда я пытаюсь использовать что-то вроде 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;
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При использовании 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 активности)

Как насчет того, чтобы сделать паузу между функцией tictacAI и функцией поворота? Я снова попытался использовать v.postDelayed, но для этого мне нужно было сделать v конечной переменной. Как мне вложить еще один постDelayed в предложенный вами postDelayed? Спасибо! @ZumiKua

Louis Ye 30.11.2018 04:51

Затем сделайте v final, если вы не пишете что-то вроде v = ...., final v подойдет.

ZumiKua 30.11.2018 04:59

Другие вопросы по теме