Почему таймер обратного отсчета в Android показывает нулевое значение

У меня есть таймер обратного отсчета, который начинает отсчет часов, минут и секунд между текущей датой и временем и будущей датой и временем.

Проблема в том, что я столкнулся с поведением моего таймера обратного отсчета, когда он продолжает работать после 00:00:00. Кроме того, таймер обратного отсчета работает нормально, но я просто не уверен, почему он продолжается до 00: 00: -1, 00: 00: -2, 00: 00: -3 ...

Я добавил условие if, которое отменяет таймер, когда время становится равным «00:00:00», что помогло, но я все еще хочу знать, почему у меня возникла эта проблема. Я почти уверен, что это ненормально, потому что я видел учебники по таймеру обратного отсчета, которые останавливаются, когда он достигает 0, без необходимости добавлять дополнительную логику. Я что-то пропустил?

    java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
    formatter.setLenient(false);

    String endTime = "23.12.2018, 01:35:00";
    Date startDate;
    Date endDate;
    long endTimeMilli = 0;

    try {
        endDate = formatter.parse(endTime);
        endTimeMilli = endDate.getTime();

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    startDate = new Date();
    startTime = startDate.getTime();

    if (startTime >= endTimeMilli)
        return;

    mCountDownTimer = new CountDownTimer(endTimeMilli, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {


            startTime -= 1;
            long serverUptimeSeconds =
                    (millisUntilFinished - startTime) / 1000;

            int hoursLeft = (int) serverUptimeSeconds / 3600;
            int minutesLeft = (int) serverUptimeSeconds  % 3600 / 60;
            int secondsLeft = (int) serverUptimeSeconds % 3600 % 60;

            String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d:%02d", hoursLeft, minutesLeft, secondsLeft);
            mCountdown.setText(timeLeftFormatted);

            if (mCountdown.getText().toString().equals("00:00:00"))
                mCountDownTimer.cancel();
        }

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

вы получаете long типа serverUptimeSeconds , а затем преобразуете его в int с помощью (int) serverUptimeSeconds / 3600;. это может привести к отрицательному значению int. Знаете ли вы, что кастинг имеет более высокий приоритет, чем операция разделения и модификации?

ZhaoGang 23.12.2018 07:35

попробуйте это: int secondsLeft = (int) (serverUptimeSeconds % 3600 % 60); и скажите мне, работает ли он

ZhaoGang 23.12.2018 07:38

@ZhaoGang Я уверен, что узнал об этом в школе, но, должно быть, забыл, так что спасибо за напоминание! Я заключил операции деления и модификации в круглые скобки, но все равно получаю тот же результат.

krabinowitz 23.12.2018 07:43

Вы уже догадались? Я изучил эту проблему и предлагаю: long serverUptimeSeconds = millisUntilFinished / 1000;

ZhaoGang 23.12.2018 15:17

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

krabinowitz 05.01.2019 01:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
201
0

Другие вопросы по теме