我正试图使用android.os.CountDownTimer来通过文本视图显示倒计时计时器,以达到健身目的。我遇到的问题是,计时器在主线程上运行似乎有问题,即倒计时将跳转2-4秒,并且显然是“滞后”的--计时器打算处于一个无穷无尽的循环中,直到按下停止按钮。
我是Java和Android的新手,我不知道如何让倒计时器运行和更新UI,而不会有任何冲突或滞后。
我试图将CountDown放在一个Handler/Runnable和Asynctask中,但没有任何结果。
MainActivity
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元素将是平滑的。
发布于 2015-01-01 23:14:01
我决定采取另一种方法,这很符合我的目的。没有滞后或线程问题,可以很容易地重新启动一遍又一遍。希望这能帮到别人。
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();
}
}
};发布于 2014-12-31 03:10:11
尝试使用Handler和runnable代替CountDownTimer。这里有一篇关于这种方法的好文章
http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/
还有一件事你可以试试
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();
}发布于 2014-12-31 07:13:07
如果你倒计时快速和频繁地改变你的TextView。您必须将TextView宽度和高度设置为固定数字,否则在计算视图缩放时会出现滞后。
https://stackoverflow.com/questions/27715602
复制相似问题