首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android CountDownTimer类滞后主线程

Android CountDownTimer类滞后主线程
EN

Stack Overflow用户
提问于 2014-12-31 03:02:39
回答 3查看 7.3K关注 0票数 4

我正试图使用android.os.CountDownTimer来通过文本视图显示倒计时计时器,以达到健身目的。我遇到的问题是,计时器在主线程上运行似乎有问题,即倒计时将跳转2-4秒,并且显然是“滞后”的--计时器打算处于一个无穷无尽的循环中,直到按下停止按钮。

我是Java和Android的新手,我不知道如何让倒计时器运行和更新UI,而不会有任何冲突或滞后。

我试图将CountDown放在一个Handler/Runnable和Asynctask中,但没有任何结果。

MainActivity

代码语言:javascript
复制
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元素将是平滑的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-01 23:14:01

我决定采取另一种方法,这很符合我的目的。没有滞后或线程问题,可以很容易地重新启动一遍又一遍。希望这能帮到别人。

代码语言:javascript
复制
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();
        }
    }
};
票数 4
EN

Stack Overflow用户

发布于 2014-12-31 03:10:11

尝试使用Handler和runnable代替CountDownTimer。这里有一篇关于这种方法的好文章

http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/

还有一件事你可以试试

代码语言:javascript
复制
void countdownTimer() {

    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            tvTextView.setText(display);
        }
    };
    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;
            final String display = String.format("%02d:%02d", mins, secs);
            textView.post(runnable);
        }

        public void onFinish() {
            countdownTimer();
        }
    }.start();
}
票数 3
EN

Stack Overflow用户

发布于 2014-12-31 07:13:07

如果你倒计时快速和频繁地改变你的TextView。您必须将TextView宽度和高度设置为固定数字,否则在计算视图缩放时会出现滞后。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27715602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档