我无法在for循环中延迟方法assign_backgrounds()
。我正在尝试创建一个 Simon说游戏,但是而不是延迟并显示下一个按钮" Simon"按下,它会立即显示所有按钮。这里的任何帮助将不胜感激。感谢。
boolean simonsTurn = true;
int x = 4;
int s;
int delay = 1000;
int array_values[] = new int[]{1,2,3,4};
public void simonSays() {
// running = true;
if (simonsTurn == true) {
go();
for (int i = 0; i < x; i++) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
go();
}
}, 1000);
}
}
}
public void go(){
s = random_int_between(0,3);
assign_backgrounds(array_values[s]);
}
public void assign_backgrounds( int array_values ){
Handler handler = new Handler();
if( array_values == 1){
button1_.invalidate();
button1_.setBackgroundResource(R.drawable.goatclicked);
button1_.refreshDrawableState();
handler.postDelayed(new Runnable(){
public void run(){
button1_.invalidate();
button1_.setBackgroundResource(R.drawable.goat);
button1_.refreshDrawableState();}}, 1000);
}
else if( array_values == 2){
button2_.invalidate();
button2_.setBackgroundResource(R.drawable.pigclicked);
button2_.refreshDrawableState();
handler.postDelayed(new Runnable(){
public void run(){
button2_.invalidate();
button2_.setBackgroundResource(R.drawable.pig);
button2_.refreshDrawableState();}}, 1000);
}
else if( array_values == 3){
button3_.invalidate();
button3_.setBackgroundResource(R.drawable.chickenclicked);
button3_.refreshDrawableState();
handler.postDelayed(new Runnable() {
public void run() {
button3_.invalidate();
button3_.setBackgroundResource(R.drawable.chicken);
button3_.refreshDrawableState();}}, 1000);
}
if( array_values == 4) {
button4_.invalidate();
button4_.setBackgroundResource(R.drawable.cowclicked);
button4_.refreshDrawableState();
handler.postDelayed(new Runnable(){
public void run(){
button4_.invalidate();
button4_.setBackgroundResource(R.drawable.cow);
button4_.refreshDrawableState();}}, 1000);
}
}
答案 0 :(得分:1)
这是因为您正在快速创建处理程序,然后它们都在同一时间启动。您应该了解Handler的工作方式以及Asyncronous / Background任务。
现在回到你的问题,你正在调用一个循环,它正在连续创建处理程序,并且它们的创建速度非常快(纳秒)。然后,由于您的postDelayed()
电话,他们将从创建时间开始1秒钟。这就是为什么一切都在同时出现的原因!所有这些延迟帖子几乎同时在并发后台线程上执行。
您希望拥有全局for(int i,...)
,而不是int i
循环,只需将其添加到文件顶部即可。
在西蒙的任何一个结束时,你都会想到if, else if
assign_background
内部go()
声明(在Runnables结尾处,然后你&#39;我想打电话给runOnMainUIThread()
。
这可能会导致问题,因为您尝试从所有这些后台线程访问主线程。因此,当您调用go
函数时,可能需要将函数date.parse();
称为快速黑客。
总而言之,在了解处理程序,后台进程和线程之前,您将遇到一些问题。绝对有很好的知识可以学习,Android只有FYI才有可靠的文档。