gpt4 book ai didi

安卓等待()不工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:53:40 25 4
gpt4 key购买 nike

这是我的第一个问题,如果我违反了任何论坛规则,请原谅我。

我需要我的程序等待 3 秒然后更改内容 View

我的代码是:

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);

程序没有错误,但没有等待。到了这部分,它只显示“主”布局,根本不显示“注销”布局。

我的方法有什么问题?

最佳答案

正如人们所指出的,不要休眠或以其他方式阻塞 UI 线程,但您似乎在创建新线程时意识到了这一点。

现在说明为什么它的行为不如您所愿:

现在,您调用 setContentView(),启动一个新线程,在 UI 线程 上第二次调用 setContentView() - - 这种情况快速连续发生,中间没有延迟/等待/ sleep 。 wait(3000) 发生在您启动的新线程中 - 因此 那个新线程 启动,等待 3000 毫秒,然后退出。这是一个代价高昂的空操作。

您需要从新线程的run() 方法内部 第二次调用setContentView() 以获得所需的效果.此外,您应该使用 sleep() 而不是 wait() -- wait() 是用于同步线程的低级工具,而 sleep() 是通常的“不要继续 X 时间量”。

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

一个可以说更好更轻便的方法是使用 Handler.postDelayed() -- 这允许您在延迟后在 UI 线程 上调用 Runnable:

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

编辑以回复您的评论:

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

请注意,要从匿名内部类(您的 new Runnable())中引用周围类的 this 实例,您需要在其前面加上周围类(您的 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);

关于安卓等待()不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8007256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com