Правильная задержка во время выполнения Java кода

Я решил написать свою игру на java (текстовый квест). По задумке когда игра дает вам право выбора(три кнопки с разными вариантами), то после нажатия кнопки должны моментально исчезнуть и через 1 секунду появиться текст, через еще 2 секунды еще один кусок текста (и так далее). То есть создать эффект появления текста. Я попробовал сделать это таким образом:

btn1.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        btn1.setVisibility(View.INVISIBLE);
        btn2.setVisibility(View.INVISIBLE);//скрываем кнопки
        btn3.setVisibility(View.INVISIBLE);

        try {
            Tread.sleep(1000)
        } catch(InterruptedException e){

        }

        textofgamestory1.setText(R.string.chapter1part1text2gv1);//меняем текст
        textofgamestory1.setVisibility(View.VISIBLE);//делаем его видимым

        try {
            Tread.sleep(1000)
        } catch(InterruptedException e){

        }

        textofgamestory2.setText(R.string.chapter1part1text3gv1);
        textofgamestory2.setVisibility(View.VISIBLE);

но, при проверки этого кода, при нажатии на кнопку, кнопки не исчезали сразу, а ждали 1 секунду а потом исчезали вмести с появлением самого текста целиком, а это не то что мне нужно. Надеюсь кто нибудь знает как правильно сделать такую задержку, заранее спасибо.


Ответы (1 шт):

Автор решения: Alex_Skvortsov
  1. Не используйте Tread.sleep в главном потоке при программировании под Андроид. Странно, что система не убила Ваше приложение. Никакие паузы тут недопустимы.
  2. Для решения Вашей проблемы простейший метод (без сторонних библиотек):

    //поле класса активности / фрагмента
    Handler h;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        h = Handler(Looper.getMainLooper());
        ...
    }
    
    //далее в пределах метода (onClick, например)
    Runnable r = new Runnable() {
        public void run() {
            // Что нужно сделать после задержки, Ваш код
        }
    }; 
    h.postDelayed(r, 1000); //с задержкой 1000 миллисекунд
    
    //отписаться надо не забыть!
    @Override
    protected void onPause() {
        h.removeCallbacksAndMessages(null);
        super.onPause();
    }
    
→ Ссылка