Java 如何在Android中设置延迟

Java 如何在Android中设置延迟,java,android,Java,Android,我知道java/androidStudio中的Thread.sleep()和postDelayed()函数。 但问题是,我正在复制西蒙·赛义德的游戏 我创建了一个generateSequence()函数,将数字1-9随机放入一个名为sequence的数组中。之后,我需要显示这些序列,它基本上会改变textView的背景一秒钟,然后使用postDelayed()函数返回到其原始背景 这是我的密码: private void displaySequence(){ for(int i = 0;

我知道java/androidStudio中的
Thread.sleep()
postDelayed()
函数。 但问题是,我正在复制西蒙·赛义德的游戏

我创建了一个
generateSequence()
函数,将数字1-9随机放入一个名为
sequence
的数组中。之后,我需要显示这些序列,它基本上会改变textView的背景一秒钟,然后使用
postDelayed()
函数返回到其原始背景

这是我的密码:

private void displaySequence(){
    for(int i = 0; i < sequence.size(); i++) {
        if(sequence.get(i) == 1) {
            viewCard11.setBackgroundResource(R.drawable.text_view_circle4);
            proceed = false;
            handler.postDelayed(() -> {
                viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
                proceed = true;
            }, 1000);
        } 
        else if(sequence.get(i) == 2) {} 
        else if(sequence.get(i) == 3) {} 
        else if(sequence.get(i) == 4) {} 
        else if(sequence.get(i) == 5) {} 
        else if(sequence.get(i) == 6) {} 
        else if(sequence.get(i) == 7) {} 
        else if(sequence.get(i) == 8) {} 
        else if(sequence.get(i) == 9) {}
        while(!proceed) {}
    }
}
private void displaySequence(){
对于(int i=0;i{
viewCard11.setBackgroundResource(R.drawable.text\u view\u circle3);
继续=真;
}, 1000);
} 
else如果(sequence.get(i)==2{}
else如果(sequence.get(i)==3{}
else如果(sequence.get(i)==4{}
else如果(sequence.get(i)==5{}
else如果(sequence.get(i)==6{}
else如果(sequence.get(i)==7{}
else如果(sequence.get(i)==8{}
else如果(sequence.get(i)==9{}
而(!继续){}
}
}
但是
postDelayed()
的问题是,只有函数内部的内容才会延迟。这意味着,如果该序列有2个元素,它将同时闪烁背景。
for
循环不会等待
postDelayed
完成它应该做的任何事情,而是递增并继续放入下一个
postDelayed

为了解决这个问题,我尝试使用
procedure
布尔变量作为延迟。我要做的是,在调用
postDelayed
之前,我将
procedure
设置为
false
。由于它不会等待
postDelayed()
,因此它将转到下一行代码,即
while
循环

通过将
procedure
设置为false,我使用它来创建一个无限循环。但是这个无限循环将被完成的
postdayed()
打破,因为
procedure
将在其中设置为true,然后代码可以继续
for
循环

但我不知道为什么它根本不起作用。当我运行代码时,它只是显示一个空白屏幕。问题似乎存在于infinite
中,而
循环和
postDelayed()
无法更新
procedue
变量

我尝试使用
Thread.sleep(1000)
替换
postDelayed
,但在启动过程中,无论参数传递到
Thread.sleep()多长时间,程序都会显示白色背景

我已经用尽了我的选择,我希望有人有更好的想法。
谢谢。

循环不会等待postDelayed,因为postDelayed中的内容是异步发生的。这意味着它在第二个线程上独立于UI线程工作。您想要完成的是让UIthread等待一段时间,而不是在特定时间段后启动另一个线程。 您可以尝试以下方式使用处理程序:

Handler handler=new Handler()
{

public void handleMessage(Message msg)
{
   if(msg.what==0)
{
 viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
      proceed = true;
}

}
};
然后您可以像这样使用处理程序:

handler.postDelayed(() -> 
{            
 //does nothing just waits 1 second and then send empty message
 handler.sendEmptyMessage(0)
}, 1000);

“for循环不会等待postDelayed完成它应该做的任何事情”-不,
for
循环不应该等待
postDelayed
。当(!继续){}
行挂起UI线程时,
。。。