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

応答しない理由は、現在のスレッドでスリープを呼び出すためです。現在扱っているスレッドは 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 に答える