1

我正在尝试在线程中运行 CountDownTimer,但它不起作用..

因此,在 MainActivitys onCreate 中,我在 Button 单击时启动它,如下所示:

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");
}

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

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

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

如何修复我的 CountDownTimer?

4

1 回答 1

3

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

private CountDownLatch doneSignal = new CountDownLatch(1);

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

于 2015-11-01T14:40:37.673 回答