geo*_*rge 5 multithreading android 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);
Run Code Online (Sandbox Code Playgroud)
该程序没有错误,但没有等待.当它到达这个部分时,它只显示"主"布局而根本没有显示"注销"布局.
我的做法有什么问题?
Phi*_*art 10
正如人们所指出的那样,不要睡觉或以其他方式阻止UI线程,但你似乎已经意识到你创建的新线程.
现在为什么它没有你想要的行为:
现在,你调用setContentView(),启动一个新线程,setContentView()在UI线程上第二次调用- 这种情况很快就连续发生,中间没有延迟/等待/睡眠.在wait(3000)如此-在你开始新的线程会发生新的线程启动,等待3000ms,然后退出.这是一个昂贵的无操作.
您将需要做第二次调用setContentView()从内新线程的run()方法来获得预期的效果.此外,您应该使用sleep()而不是wait()- wait()是一个用于同步线程的低级工具,而sleep()通常是"不要持续X时间".
让我提出一个更好的方法:
一个可以说更好,更轻的approch正在使用Handler.postDelayed()- 这允许你在延迟后调用UI线程上的Runnable :
setContentView(R.layout.logout);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setContentView(R.layout.main);
}
}, 3000);
Run Code Online (Sandbox Code Playgroud)
编辑以回复您的评论:
在Runnable之前定义并找到按钮作为最终变量,这样您可以稍后从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);
Run Code Online (Sandbox Code Playgroud)
wait()不等待一定的时间,而是具有当前线程等待this做notify()了最大的时间量.你在寻找什么,是Thread.sleep().
而目前唯一需要等待的是你正在产生的额外线程,而不是活动本身.这就是为什么我建议你看看Handler.postDelayed(),CountDownTimer或者AsyncTask.处理线程非常低级.
| 归档时间: |
|
| 查看次数: |
6911 次 |
| 最近记录: |