gpt4 book ai didi

java - 倒计时器根本不工作

转载 作者:行者123 更新时间:2023-12-02 04:14:30 25 4
gpt4 key购买 nike

我试图在线程内运行 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");
}

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

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

当我删除整个线程内容并仅在按钮 onClick 中调用 runner.run(); (同时删除运行程序实例中的实现 Runnable)时,我得到以下日志条目: onCLick,运行,启动,启动,等待。但随后什么也没有发生,就好像计时器没有运行,没有调用 onTick 方法。

如何修复我的 CountDownTimer?

最佳答案

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

private CountDownLatch doneSignal = new CountDownLatch(1);

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

关于java - 倒计时器根本不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com