如何在java中的for循环中延迟方法?

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)

nap*_*ror 1

这是因为您创建处理程序的速度非常快,然后它们全部同时启动。您应该研究处理程序的工作方式以及异步/后台任务。

现在回到你的问题,你正在调用一个循环,它连续创建处理程序,并且它们的创建速度非常快(纳秒)。然后,由于您的postDelayed()调用,它们将在创建时间后 1 秒全部启动。这就是为什么所有东西都会同时弹出!所有这些延迟帖子几乎同时在并发后台线程上执行。

for(int i,...)您想要一个全局的而不是循环int i,只需将其添加到文件的顶部即可。

在 Simon 的任何回合结束时,您都需要在if, else if语句内部assign_background(在 Runnables 的末尾)调用go().

这可能会导致问题,因为您正在尝试从所有这些后台线程访问主线程。因此,当您调用该函数时,您可能必须调用runOnMainUIThread()该函数作为快速技巧go

总而言之,在您了解处理程序、后台进程和线程之前,您将会遇到一些问题。绝对值得学习的知识,Android 有可靠的文档(仅供参考)。