Как показать представление в течение 3 секунд, а затем скрыть его?

Я попытался с потоками, но андроид выбрасывает "CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений".

Итак, как я могу подождать 3 секунды, а затем скрыть представление, позволяя графическому интерфейсу реагировать?

-

Таймер также использует другой поток, поэтому он не решит.

Ответы

Ответ 1

Создайте отдельный поток, который спит в течение 3 секунд, затем вызовите runOnUiThread, чтобы скрыть представление.

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // Do some stuff
                }
            });
        }
    };
    thread.start(); //start the thread

Ответ 2

Есть более простой способ сделать это: использовать View.postDelayed(runnable, delay)

View view = yourView;
view.postDelayed(new Runnable() {
        public void run() {
            view.setVisibility(View.GONE);
        }
    }, 3000);

Это не очень точно: может быть скрыто через 3,5 или 3,2 секунды, потому что оно отправляет сообщения в очередь сообщений пользовательского интерфейса.

Используйте post() или runOnUiThread() просто как setTimeout().

Ответ 3

Без необходимости иметь ссылку на просмотр или спящий поток:

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            // do stuff
        }
    }, 3000);

Ответ 4

Я знаю, что это натянуто, но вот ответ с сопрограммами, если вам случится их использовать:

    lifecycleScope.launch {
        delay(3000)
        header.visibility = View.GONE
    }