0

我尝试使用Thread.sleep()但没有用。当我使用它时,应用程序停止响应。

我需要像这样在我的代码中添加一些延迟:

public void inicioJogo(){
        for (int jogada = 1; jogada <= 50; jogada++) {
            for (int contador = 0; contador < jogada; contador++){
                // HERE - Wait 1 sec before go to next line.
                btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                // HERE - Wait 1 sec before go to next line.
                btPedra[sequencia[contador]].setBackgroundResource(imagensNormal[sequencia[contador]]);
                // Now continue looping.
            }
        }
}

我尝试使用 Handler,如下所示:

private Handler handler = new Handler();
    for (int jogada = 1; jogada <= 50; jogada++) {
        for (int contador = 0; contador < jogada; contador++){
            handler.postDelayed(new Runnable () {
                @Override
                public void run() {
                    btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                }
            }, 1000);
        }
    }

但是当我使用它时,循环会在等待 1 秒之前继续。我需要一个可以停止循环 1 秒的延迟,转到下一行,然后继续循环。

4

2 回答 2

1

你可以使用ScheduledExecutorService喜欢

ScheduledExecutorService scheduledExecutorService =
    Executors.newScheduledThreadPool(NO_OF_THREADS);

ScheduledFuture scheduledFuture =
    scheduledExecutorService.schedule(task, NO_OF_SECONDS_TO_WAIT, TimeUnit.SECONDS);

现在“任务”在延迟 NO_OF_SECONDS_TO_WAIT 后执行

于 2015-06-11T05:24:46.933 回答
0

它没有响应的原因是因为您在当前线程上调用了 sleep 。您正在处理的当前线程是 UI 线程。所以基本上你尝试改变背景,然后让线程休眠,防止它实际被改变,直到休眠完成。

您需要在另一个线程中运行循环并在那里休眠,这样它就不会影响主线程:

final Handler handler = new Handler();
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int jogada = 1; jogada <= 50; jogada++) {
            for (int contador = 0; contador < jogada; contador++){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                    }
                });
            }
        }
    }
}).start();

请注意,后台更改是通过您在启动新线程之前创建的处理程序完成的。该处理程序是在当前线程(即 UI 线程)上创建的,并且发布到它的每条消息都将在该线程上运行。

所以基本上你循环并等待另一个线程,但在 UI 线程上进行背景更改。

于 2015-06-11T05:25:05.630 回答