java - Android CountDownTimer 类滞后于主线程

标签 java android multithreading timer countdown

出于健身目的,我正在尝试使用 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/

相关文章:

java - 显示 Java 中与 2 个线程同步的用法

java - Eclipse插件: create a treeview that displays all the deprecated methods

Android Intel x86 模拟器与真实设备(性能)

python - 变量循环和同步

java - 我们如何加载位于同一文件夹内不同属性文件中的所有属性?

java - 在 Java 中从文本文件中检索单个特定数字的有效方法

java - 单线程和多线程程序的基准

java - Tomcat 中运行计划任务

java - 如何从我的应用程序打开日历?

android - 未知的 Chrome 错误 : 0