Как показать представление в течение 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
}