Показать оставшееся время обработчика - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы знать, как отобразить время, оставшееся в моем обработчике.Когда я нажимаю кнопку, я запускаю свой обработчик в течение x секунд и хочу отобразить обратный отсчет на экране до конца обработчика.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

официальная документация

Пример отображения 30-секундного обратного отсчета в текстовом поле:

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

     public void onFinish() {
         mTextField.setText("done!");
     }
}.start();
0 голосов
/ 13 марта 2019

Работает нормально, спасибо, последняя деталь, если я поставлю 5 секунд, он показывает: 5, 4, 3, 2, 1 и 0. В итоге это 6 секунд.

Максим, как я читаю в вашем комментарии к ответу Томаса Мэри, вы хотите избежать дополнительного вызова onTick ().

Вы видите это, потому что оригинальная реализация CountDownTimer впервые вызывает 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 () метод соответственно.

0 голосов
/ 27 февраля 2019

Попробуйте это:

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