Мне нужно приостановить чтения кода, а именно 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 шт):

Автор решения: woesss

Так делать нельзя. Все операции с 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() {
        . . . //код который генерирует новый вопрос
    }
→ Ссылка