Мне нужно приостановить чтения кода, а именно try в методе OnClickListener()
Я создаю простую игру с четырьмя вариантами ответа. Если человек нажимает на один из них (кнопки) то, кнопке сетается Correct или Incorrect, а потом это исчезает и появляется следующий вопрос и меняются варианты ответа на кнопках. Проблема в том, что Thread.sleep() полностью останавливает чтение. То есть, при нажатии на кнопку оно ожидает и выводит мне следующий вопрос, без задержки перед этим.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_try);
Button play_button = (Button) findViewById(R.id.button2);
TextView text = (TextView) findViewById(R.id.textView3);
play_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
. . . //код, который показывает правильность ответа
Thread.sleep(3000);
. . . //код который генерирует новый вопрос
} catch (Exception e)
{
}
}
});
Ответы (1 шт):
Так делать нельзя. Все операции с UI выполняются в главном потоке приложения, обработчики событий выполняются в нём же - соответственно все изменения UI отобразятся только когда поток освободится и применит их, то есть после завершения метода onClick().
Здесь придётся познакомиться с многопоточностью, но к счастью, грязную работу уже сделали за нас и мы можем воспользоваться готовыми решениями, например:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_try);
Button play_button = (Button) findViewById(R.id.button2);
TextView text = (TextView) findViewById(R.id.textView3);
play_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
. . . //код, который показывает правильность ответа
// ставим задачу генерации нового вопроса
// в очередь UI-потока с желаемой задержкой
v.postDelayed(() -> nextQuest(), 3000);
}
});
}
private void nextQuest() {
. . . //код который генерирует новый вопрос
}