Chr*_*man 5 java methods android for-loop handler
我assign_backgrounds()在for循环中延迟方法时遇到问题.我正在尝试创建一个西蒙说的游戏,但不是延迟并显示"西蒙"按下的下一个按钮,它会立即显示所有按钮.这里的任何帮助将不胜感激.谢谢.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为您创建处理程序的速度非常快,然后它们全部同时启动。您应该研究处理程序的工作方式以及异步/后台任务。
现在回到你的问题,你正在调用一个循环,它连续创建处理程序,并且它们的创建速度非常快(纳秒)。然后,由于您的postDelayed()调用,它们将在创建时间后 1 秒全部启动。这就是为什么所有东西都会同时弹出!所有这些延迟帖子几乎同时在并发后台线程上执行。
for(int i,...)您想要一个全局的而不是循环int i,只需将其添加到文件的顶部即可。
在 Simon 的任何回合结束时,您都需要在if, else if语句内部assign_background(在 Runnables 的末尾)调用go().
这可能会导致问题,因为您正在尝试从所有这些后台线程访问主线程。因此,当您调用该函数时,您可能必须调用runOnMainUIThread()该函数作为快速技巧go。
总而言之,在您了解处理程序、后台进程和线程之前,您将会遇到一些问题。绝对值得学习的知识,Android 有可靠的文档(仅供参考)。