Android wait()无效

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)


Til*_*lge 5

wait()不等待一定的时间,而是具有当前线程等待thisnotify()了最大的时间量.你在寻找什么,是Thread.sleep().

而目前唯一需要等待的是你正在产生的额外线程,而不是活动本身.这就是为什么我建议你看看Handler.postDelayed(),CountDownTimer或者AsyncTask.处理线程非常低级.