Как исправить ошибку с CountDownTimer в приложении для Android

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

    String givenDateString = "2019-05-15T09:00:00";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    try {
        Date mDate = sdf.parse(givenDateString);
         timeInMilliseconds = mDate.getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }

    new CountDownTimer(timeInMilliseconds, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            long day = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
            millisUntilFinished -= TimeUnit.DAYS.toMillis(day);

            long hour = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
            millisUntilFinished -= TimeUnit.HOURS.toMillis(hour);

            long minute = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
            millisUntilFinished -= TimeUnit.MINUTES.toMillis(minute);

            long second = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);

            prueba.setText("Days: "+day+" Hours: "+hour+" Minutes: "+minute+" Seconds: "+second);
        }

        @Override
        public void onFinish() {
            // What ever you want !
        }

    }.start();

И я получаю этот результат:

Как исправить ошибку с CountDownTimer в приложении для Android

Новая ошибка android.view.ViewRootImpl$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться своих представлений.

TextView prueba;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prueba = findViewById(R.id.prueba);

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            Date currentDate = null;
            Date destinationDate = null;
            try {
                currentDate = Calendar.getInstance().getTime();
                destinationDate = sdf.parse("2019-05-15T09:00:00");

            } catch (ParseException e) {
                e.printStackTrace();
            }
            calculateDifference(currentDate, destinationDate);
        }
    }, 0, 1000);//Update text every second
}

public void calculateDifference(Date startDate, Date endDate) {
    long different = endDate.getTime() - startDate.getTime();

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;

    long days = different / daysInMilli;
    different = different % daysInMilli;

    long hours = different / hoursInMilli;
    different = different % hoursInMilli;

    long minutes = different / minutesInMilli;
    different = different % minutesInMilli;

    long seconds = different / secondsInMilli;

    Log.e("calculation", "Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
    prueba.setText("Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
}

с какой даты начала вы хотите, чтобы таймер был статистикой, потому что вы не можете рассчитать счетчик всей жизни, поскольку он показывает вам 18000 с лишним дней

Arbaz Pirwani 03.05.2019 20:38

Я хочу рассчитать оставшееся время от даты, указанной в моем коде, до текущей даты.

Marc 03.05.2019 20:40

например, если вы выберете 1 мая, он рассчитает разницу между текущей датой и 1 мая? правильно ? а также вы выбираете дату будущего, она остается прежней, но в плюсе?

Arbaz Pirwani 03.05.2019 20:42

Да, я хочу этого @ArbazPirwani

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

Ответы 1

Ответ принят как подходящий

Здравствуйте, вот как вы можете этого добиться

Вот метод, который вычисляет разницу между двумя датами.

public void calculateDifference(Date startDate, Date endDate) {
    long different = endDate.getTime() - startDate.getTime();

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;

    long days = different / daysInMilli;
    different = different % daysInMilli;

    long hours = different / hoursInMilli;
    different = different % hoursInMilli;

    long minutes = different / minutesInMilli;
    different = different % minutesInMilli;

    long seconds = different / secondsInMilli;

    Log.e("calculation", "Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);

}

Вы можете установить текст вашего текстового представления вместо журнала

И вот как вы можете вызвать таймер с датой

Timer timer = new Timer();
    timer.schedule(new TimerTask() {

        @Override
        public void run() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            Date currentDate = null;
            Date destinationDate = null;
            try {
                currentDate = Calendar.getInstance().getTime();
                destinationDate = sdf.parse("2019-05-15T09:00:00");

            } catch (ParseException e) {
                e.printStackTrace();
            }

            calculateDifference(currentDate, destinationDate);

        }

    }, 0, 1000);//Update text every second
}

Я получаю эту ошибку: android.view.ViewRootImpl$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться своих представлений.

Marc 03.05.2019 21:25

Вы можете попробовать это с таймером, который вы создали, это происходит из-за таймера, я думаю

Arbaz Pirwani 03.05.2019 21:30

Теперь я просто отредактировал то, что у меня есть, и у меня не работает.

Marc 03.05.2019 21:40

О, но вы знаете, что это на самом деле работает здесь ? и показывает мне, что осталось 11 дней и т. д.

Arbaz Pirwani 03.05.2019 21:41

Да, теперь он хорошо вычисляется, но я получаю сообщение об ошибке, когда пытаюсь поместить текст в TextView.

Marc 03.05.2019 21:43

он также настраивается на textview

Arbaz Pirwani 03.05.2019 21:50

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