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 を修正するにはどうすればよいですか?