Функция сна не отстает от хода ИИ - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно добавить искусственную паузу, прежде чем мой ИИ сыграет свою очередь на доске Tic Tac Toe.Однако, когда я пытаюсь использовать что-то вроде 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;
    }
}

1 Ответ

0 голосов
/ 30 ноября 2018

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

...