1

Thread 内で CountDownTimer を実行しようとしていますが、うまくいきません。

したがって、MainActivitys onCreate では、次のようにボタンをクリックして開始します。

public void onClick(final View v) {
    Log.d("Main", "onClick");
    runOnUiThread(runner);
}

runnerを実装するクラスのインスタンスですRunnable:

private CountDownLatch doneSignal = new CountDownLatch(1);
@Override
public void run() {
    Log.d("WR", "run");
    this.countDown(20);
    Log.d("WR", "waiting");
    try {
        doneSignal.await();
    } catch (final InterruptedException ex) {
        Log.e("WR", ex.getMessage(), ex);
    }
    Log.d("WR", "waited");
}
private void countDown(int time) {
    final CountDownTimer timer = new CountDownTimer(time * 1000, 1000) {

        @Override
        public void onTick(final long millisUntilFinished) {
            Log.d("WR", "onTick");
        }

        @Override
        public void onFinish() {
            Log.d("WR", "onFinish");
            doneSignal.countDown();
        }
    };
    Log.d("WR", "starting");
    timer.start();
    Log.d("WR", "started");
}

このコードでは、Logging onClick、実行、および開始後にアプリケーションがフリーズするだけです。に変更runOnUiThread(runner)するnew Thread(runner).start();と、Logging onClick の直後にアプリケーションがクラッシュし、出力がなくなります。

一部の調査では、ハンドラーを使用しているため、UI-Thread で CountDownTimer を実行する必要があるとされています。しかし、それはちょうどフリーズします。

スレッド全体を削除し、ボタンの onClick を呼び出すだけrunner.run();で (ランナー インスタンスの実装 Runnable も削除します)、次のログ エントリが取得されますonCLick, run, starting, started, waiting。しかし、タイマーが実行されず、onTick メソッドが呼び出されないかのように、何も起こりません。

CountDownTimer を修正するにはどうすればよいですか?

4

1 に答える 1

3

CountDownTimerUI スレッドで実行され、UI スレッドで実行する必要があります。これは、内部で Handler を使用し、それが今度は Looper を必要とするためです。runOnUiThread(runner);ランナーが何をするにしても、UI スレッドで実行されます。

private CountDownLatch doneSignal = new CountDownLatch(1);

await()UIスレッドで呼び出すとブロックさcountDown() れ、同じスレッドで実行されるため、実質的dead-lockedにアプリ

于 2015-11-01T14:40:37.673 に答える