显示处理程序的剩余时间

问题描述 投票:0回答:3

我想知道如何显示处理程序中的剩余时间。当我单击一个按钮时,我运行我的处理程序x秒,我想在处理程序结束之前在屏幕上显示倒计时。

android handler countdown countdowntimer
3个回答
0
投票

official documentation

在文本字段中显示30秒倒计时的示例:

new CountDownTimer(30000, 1000) {
     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
}.start();

0
投票

试试这个:

    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);

0
投票

它工作正常,谢谢你,最后的细节,如果我放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()方法中的实现。

© www.soinside.com 2019 - 2024. All rights reserved.