Android wait () не работает - PullRequest
       3

Android wait () не работает

5 голосов
/ 04 ноября 2011

Это мой первый вопрос здесь, поэтому, пожалуйста, прости меня, если я нарушил любое из правил форума.

Мне нужно, чтобы моя программа подождала 3 секунды, а затем изменила представление содержимого

Мой код:

setContentView(R.layout.logout); 

new Thread(new Runnable() { 
    @Override 
    public void run(){ 
        try { 
           synchronized(this){ 
                wait(3000);
            } 
        } 
        catch(InterruptedException ex){                     
        }            
    } 
}).start();

setContentView(R.layout.main);

Программа работает без ошибок, но нет ожидания.Когда он доходит до этой части, он просто показывает «основной» макет без отображения макета «выхода».

Что не так в моем подходе?

Ответы [ 5 ]

10 голосов
/ 04 ноября 2011

Как уже отмечалось, не спите и не блокируйте поток пользовательского интерфейса иным образом, но вы, похоже, знаете об этом с созданным вами новым потоком.

Теперь, почему он не ведет себя так, как вы хотите:

Прямо сейчас вы звоните 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);
5 голосов
/ 04 ноября 2011

wait() не ожидает определенное количество времени, а имеет текущий поток, ожидающий, пока this сделает notify() в течение максимального количества времени.То, что вы ищете, это Thread.sleep().

И на данный момент единственное, что будет ждать, - это дополнительный поток, который вы создаете, а не сама деятельность.Вот почему я бы посоветовал вам взглянуть на Handler.postDelayed(), CountDownTimer или AsyncTask.Обработка темы очень низкоуровневая.

3 голосов
/ 04 ноября 2011

Ваш код не работает, чтобы спать поток пользовательского интерфейса. Чтобы спать сон пользовательского интерфейса попробуйте этот код

new Handler().postDelayed(new Runnable() 
{ 
    public void run() 
    { 
        setContentView(R.layout.main);
    }
}, 3000);
0 голосов
/ 04 ноября 2011

Насколько я понимаю, ожидание происходит в новом потоке, когда вы вызываете setContentView (R.layout.main) в текущем потоке.

Попробуйте

setContentView(..)
synchronized(this) {
    this.wait(1000);
}
setContentView(..)

Обратите внимание, что спать или ждать в потоке пользовательского интерфейса не рекомендуется.

0 голосов
/ 04 ноября 2011

Попробуйте использовать Sleep () вместо Wait ()

android.os.SystemClock.sleep (3000)

...