这是我的第一个问题,如果我不遵守任何论坛规则,请原谅我。
我需要我的程序等待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);
该程序没有错误,但没有等待。当它到达这个部分时,它只显示“主”布局而根本没有显示“注销”布局。
我的方法出了什么问题?
答案 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()
,CountDownTimer
或AsyncTask
的原因。处理线程非常低级。
答案 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线程中休眠或等待不是最好的做法。