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

时间:2015-06-06 01:57:36

标签: java android for-loop methods handler

我无法在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);
    }
}

1 个答案:

答案 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才有可靠的文档。