Как уже отмечалось, не спите и не блокируйте поток пользовательского интерфейса иным образом, но вы, похоже, знаете об этом с созданным вами новым потоком.
Теперь, почему он не ведет себя так, как вы хотите:
Прямо сейчас вы звоните setContentView()
, запускаете новый поток, вызываете setContentView()
второй раз в потоке UI - это происходит быстро, без задержки / ожидания / ожидания между ними. wait(3000)
происходит в новом потоке, который вы запустили - поэтому , который запускает новый поток , ждет 3000 мс, а затем завершается. Это дорогое бездействие.
Вам потребуется второй вызов setContentView()
из внутри метода run()
этого нового потока, чтобы получить желаемый эффект. Кроме того, вы должны использовать sleep()
вместо wait()
- wait()
- это низкоуровневый инструмент для синхронизации потоков, в то время как sleep()
является обычным «не продолжать в течение X времени».
Позвольте мне предложить лучший способ:
Возможно, более приятный и гораздо более легкий подход использует Handler.postDelayed()
- это позволяет вам вызывать Runnable в потоке UI после задержки:
setContentView(R.layout.logout);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setContentView(R.layout.main);
}
}, 3000);
Изменить, чтобы ответить на ваш комментарий:
Определите и найдите кнопку перед Runnable как переменную final , чтобы вы могли получить к ней доступ позже из Runnable.
Обратите внимание, что для ссылки на экземпляр this
окружающего класса изнутри анонимного внутреннего класса (вашего new Runnable()
) вам необходимо добавить к нему префикс имени класса окружающего (вашего Activity
класса) :
final View submitButton = findViewById(R.id.submit_button);
setContentView(R.layout.logout);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setContentView(R.layout.main);
// adapt to your actual Activity class name:
submitButton.setOnClickListener(YourClassName.this);
}
}, 3000);