出于健身目的,我正在尝试使用 android.os.CountDownTimer 通过 TextView 逐字显示倒数计时器。我遇到的问题是计时器似乎在主线程上运行时遇到问题,即倒计时将跳跃 2-4 秒并且显然被“滞后” - 计时器旨在无限循环直到停止按钮按下。
我是 Java 和 Android 的新手,无法弄清楚如何在没有任何冲突或滞后的情况下让倒数计时器运行和更新 UI。
我曾尝试将 CountDown 放入 Handler/Runnable 和 Asynctask 中,但没有成功。
主要 Activity
CountDownTimer timer;
void countdownTimer() {
long min = countdownMins * 60000;
long sec = countdownSecs * 1000;
long milliseconds = min+sec;
timer = null;
timer = new CountDownTimer(milliseconds, 1000) {
public void onTick(long millisUntilFinished) {
long mins = millisUntilFinished / 60000;
long secs = millisUntilFinished % 60000 / 1000;
String display = String.format("%02d:%02d", mins, secs);
tvTextView.setText(display);
}
public void onFinish() {
countdownTimer();
}
}.start();
}
非常感谢任何能告诉我如何让它脱离主线程运行以便我的 UI 元素流畅的人。
最佳答案
我决定采用一种不同的方法,这种方法非常适合我的目的。没有滞后或线程问题,可以很容易地一遍又一遍地重新启动。希望这可以帮助某人。
int startCountdown = 5;
int currentCountdown;
Handler countdownHandler = new Handler();
Timer countdownTimer = new Timer();
public void startCountdownTimer() {
currentCountdown = startCountdown;
for (int i = 0; i <= startCountdown; i++) {
TimerTask task = new TimerTask() {
@Override
public void run() {
countdownHandler.post(doA);
}
};
countdownTimer.schedule(task, i * 1000);
}
}
final Runnable doA = new Runnable() {
@Override
public void run() {
if (currentCountdown != 0) {
tvTextView.setText("" + currentCountdown);
currentCountdown--;
} else {
currentCountdown = startCountdown;
startCountdownTimer();
}
}
};
关于java - Android CountDownTimer 类滞后于主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715602/