CountDownTimer 根本不工作

CountDownTimer not working at all

我正在尝试 运行 线程内的 CountDownTimer,但它不会工作..

所以在 MainActivity 的 onCreate 中,我在单击按钮时启动它:

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

runner 是 class 的一个实例,它实现了 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");
}

使用此代码,应用程序仅在登录 onClick、运行 和启动后冻结。 将 runOnUiThread(runner) 更改为 new Thread(runner).start(); 会使应用程序在登录 onClick 后立即崩溃,没有更多输出。

一些研究表明,由于使用了处理程序,CountDownTimer 需要在 UI-Thread 上 运行。但它只是冻结。

当我删除整个 Thread 内容并仅在 Buttons onClick 中调用 runner.run();(同时删除 运行ner 实例中的 Runnable 实现)时,我得到以下日志条目:onCLick, run, starting, started, waiting.但是之后什么也没有发生,好像定时器没有运行,没有调用onTick方法

如何修复我的 CountDownTimer?

CountDownTimer 运行s 在 Ui 线程上,它必须 运行 在 UI 线程上,因为它在内部使用处理程序,这又需要一个 Looper。 runOnUiThread(runner); 无论 运行ner 做什么,运行s 在 UI 线程上。

private CountDownLatch doneSignal = new CountDownLatch(1);

在 UI 线程上调用 await() 会阻止它,并且由于 countDown() 运行 在同一个线程上,您实际上 dead-locked 您的应用程序