У меня есть таймер обратного отсчета, который начинает отсчет часов, минут и секунд между текущей датой и временем и будущей датой и временем.
Проблема в том, что я столкнулся с поведением моего таймера обратного отсчета, когда он продолжает работать после 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();
попробуйте это: int secondsLeft = (int) (serverUptimeSeconds % 3600 % 60); и скажите мне, работает ли он
@ZhaoGang Я уверен, что узнал об этом в школе, но, должно быть, забыл, так что спасибо за напоминание! Я заключил операции деления и модификации в круглые скобки, но все равно получаю тот же результат.
Вы уже догадались? Я изучил эту проблему и предлагаю: long serverUptimeSeconds = millisUntilFinished / 1000;
@ZhaoGang, извини, я просто возвращаюсь к тебе. Был с семьей на праздниках, но я просто попробовал ваше предложение, и это не решило мою проблему. Я просто оставлю это в покое и продолжу работу над остальной частью проекта, поскольку это всего лишь незначительная проблема. Я ценю, что вы изучили это!




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