CountDownTimer в Android с использованием Java - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь реализовать таймер в android. Я использую таймер обратного отсчета. Вот код таймера:

 new CountDownTimer(totalTime * 1000, 1000) {
        @Override
        public void onTick(long l) {
            int newSec = (int) (sec - (sec - (l / 1000)));
            if(l % 60 == 0) {
                min--;
            }
            if(newSec < 10) {
                tv_timer.setText(min + ":" + z + newSec);
            } else {
                tv_timer.setText(min + ":" + newSec);
            }
        }

        @Override
        public void onFinish() {
            mediaPlayer.start();
        }
    }.start();

Таймер продолжает обновлять количество времени, оставшееся на экране пользователя.

Проблема в том, что таймер продолжает завершаться в 00:01 (1 секунда ), 00:00 никогда не отображается, а сигнал будильника звучит через 2 секунды после окончания таймера.

Как я могу отобразить 00:00 и как заставить сигнал будильника зазвонить сразу после окончания таймера ?

Это код панели поиска. Панель поиска используется пользователем для установки таймера:

seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            z = 0;
            min = i / 60;
            sec = i - min * 60;
            if(sec < 10) {
                tv_timer.setText(min + ":" + z + sec);
            } else {
                tv_timer.setText(min + ":" + sec);

            }
            totalTime = i;
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Как показано в документации CountDownTimer

onTick (long millisUntilFinished)

millisUntilFinished long: количество времени до завершения.

Это означает, что 00:00 никогда не будет отображаться в вашем коде, потому что onTick не будет вызываться, когда не останется времени для завершения.

Просто вы должны показать 00:00 внутри onFinish

@Override
        public void onFinish() {
            tv_timer.setText("00:00");
            mediaPlayer.start();
        }

Насчет сигнала будильника, кажется, он звонит сразу после окончания обратного отсчета. Вы должны убедиться, что в самом звуковом сигнале нет молчания на одну или две секунды в начале.

0 голосов
/ 10 июля 2020

Вслед за (правильным) ответом @ShadySherif добавление базовых c журналов поможет понять поведение и выделить подозрительное утверждение в вашем коде.

Фрагмент:

// Countdown 10 seconds providing an update every second until finished.
new CountDownTimer(10 * 1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
       Log.d("sotest",Long.toString(millisUntilFinished));
    }

    @Override
    public void onFinish() {
        Log.d("sotest","Finish");
    }
}.start();

Журнал (обратите внимание, что значения millisUntilFinished будут меняться при каждом запуске):

2020-07-10 09:32:46.628 9087-9087/calculations D/sotest: 9986
2020-07-10 09:32:47.629 9087-9087/calculations D/sotest: 8985
2020-07-10 09:32:48.630 9087-9087/calculations D/sotest: 7983
2020-07-10 09:32:49.633 9087-9087/calculations D/sotest: 6981
2020-07-10 09:32:50.636 9087-9087/calculations D/sotest: 5978
2020-07-10 09:32:51.640 9087-9087/calculations D/sotest: 4974
2020-07-10 09:32:52.643 9087-9087/calculations D/sotest: 3970
2020-07-10 09:32:53.647 9087-9087/calculations D/sotest: 2967
2020-07-10 09:32:54.650 9087-9087/calculations D/sotest: 1964
2020-07-10 09:32:55.653 9087-9087/calculations D/sotest: 961
2020-07-10 09:32:56.616 9087-9087/calculations D/sotest: Finish

Одно подозрительное утверждение:

// Incorrect, this performs:
//   "every time the millisUntilFinished value is a multiple of 60,
//   decrement what most likely is a minute value."
if(l % 60 == 0) {
    min--;
}

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

Дело в том, что простое ведение журнала может очень помочь в понимании проблем.

Кроме того, из журнала вы можете увидеть интересное поведение, которое является «дрейфом» значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...