【问题标题】:How do I delay a method in a for loop in java?java - 如何在Java的for循环中延迟方法?
【发布时间】:2015-08-21 02:13:12
【问题描述】:

我无法在 for 循环中延迟方法 assign_backgrounds()。我正在尝试创建一个西蒙说游戏,但不是延迟并显示“西蒙”按下的下一个按钮,而是一次显示所有按钮。在这里的任何帮助将不胜感激。谢谢。

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);
    }
}

【问题讨论】:

    标签: java android for-loop methods handler


    【解决方案1】:

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

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

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

    在轮到 Simon 的任何一个结束时,在 assign_background 内的 if, else if 语句内(在 Runnables 结束时,您需要调用 go()

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多