Android wait()无效

时间:2011-11-04 09:37:35

标签: android multithreading handler wait

这是我的第一个问题,如果我不遵守任何论坛规则,请原谅我。

我需要我的程序等待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 个答案:

答案 0 :(得分:10)

正如人们所指出的那样,不要睡觉或以其他方式阻止UI线程,但您似乎已经通过您创建的新线程了解这一点。

现在为什么它的行为不符合您的要求:

现在,你打电话给setContentView(),开始一个新线程,第二次在 UI线程上调用setContentView() - 这种情况会在没有延迟的情况下快速连续发生/等待/睡眠中间。 wait(3000)发生在你开始的新线程中 - 所以新线程启动,等待3000ms,然后退出。这是一个昂贵的无操作。

您需要从里面的中再次调用<{1}}新线程的setContentView()方法才能获得所需的效果。此外,您应该使用run()而不是sleep() - wait()是用于同步线程的低级工具,而wait()是通常的“不会继续X量时间“。

让我提出一个更好的方法:

一个可以说更好,更轻的approch正在使用Handler.postDelayed() - 这允许你在延迟后调用 UI线程上的Runnable:

sleep()

编辑以回复您的评论:

在Runnable之前定义并找到按钮作为 final 变量,这样您可以稍后从Runnable内部访问它。

请注意,要从匿名内部类(您的setContentView(R.layout.logout); new Handler().postDelayed(new Runnable() { @Override public void run() { setContentView(R.layout.main); } }, 3000); )中引用周围类的this实例,您需要在其前面加上周围类的类名(您的{ {1}}类):

new Runnable()

答案 1 :(得分:5)

wait()不会等待一段时间,而是让当前线程等待this执行notify()最长时间。您正在寻找的是Thread.sleep()

目前唯一可以等待的是你正在产生的额外线程,而不是活动本身。这就是我建议您查看Handler.postDelayed()CountDownTimerAsyncTask的原因。处理线程非常低级。

答案 2 :(得分:3)

您的代码无法正常睡眠UI线程。要睡眠UI线程尝试此代码

new Handler().postDelayed(new Runnable() 
{ 
    public void run() 
    { 
        setContentView(R.layout.main);
    }
}, 3000);

答案 3 :(得分:0)

尝试使用Sleep()而不是Wait()

  

android.os.SystemClock.sleep(3000)

答案 4 :(得分:0)

据我所知,等待发生在新线程中,当你在当前线程中调用setContentView(R.layout.main)时。

尝试

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

请注意,在UI线程中休眠或等待不是最好的做法。