我想知道如何显示处理程序中的剩余时间。当我单击一个按钮时,我运行我的处理程序x秒,我想在处理程序结束之前在屏幕上显示倒计时。
在文本字段中显示30秒倒计时的示例:
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
试试这个:
int time = 60; // seconds
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
time--;
mTextView.setText(time + " seconds");
}
};
handler.postDelayed(runnable, 1000);
它工作正常,谢谢你,最后的细节,如果我放5秒,它显示:5,4,3,2,1和0.最后它是6秒。
Maxime,正如我在你对Thomas Mary的回答的评论中所读到的,你想避免额外调用onTick()。
你看到这个是因为CountDownTimer的original implementation第一次调用onTick(),一旦启动计时器(没有延迟)。
如何删除最后的0?
为此,您可以使用此修改后的CountDownTimer:
public abstract class CountDownTimer {
private final long mMillisInFuture;
private final long mCountdownInterval;
private long mStopTimeInFuture;
private boolean mCancelled = false;
public CountDownTimer(long millisInFuture, long countDownInterval) {
mMillisInFuture = millisInFuture;
mCountdownInterval = countDownInterval;
}
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
public synchronized final CountDownTimer start() {
mCancelled = false;
if (mMillisInFuture <= 0) {
onFinish();
return this;
}
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
onTick(mMillisInFuture);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG), mCountdownInterval);
return this;
}
public abstract void onTick(long millisUntilFinished);
public abstract void onFinish();
private static final int MSG = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
synchronized (CountDownTimer.this) {
if (mCancelled)
return;
final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
if (millisLeft <= 0) {
onFinish();
} else {
onTick(millisLeft);
sendMessageDelayed(obtainMessage(MSG), mCountdownInterval);
}
}
}
};
}
请注意,您可能需要相应地调整onTick()方法中的实现。