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