Я разрабатываю приложение для Android, которое заканчивается через определенное время. Я добавил кнопку на панель действий, и она должна показать оставшееся время пользователю. Вот код:Android, показывающий оставшееся время, отличается от устройств
String srt = getResources().getString(R.string.remainingTime) + " ";
DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
long gt = timeKeeper.getTimeUntilTermination() - timeKeeper.getElapsedTime(); // gotten from elsewhere
long ct = System.currentTimeMillis() - countdownStartedAt;
Date rt = new Date(gt - ct); // remaining time
showToast(srt + fmt.format(rt));
Во время тестирования его на AVD, тост содержит правильное оставшееся время (например, «00:44:32»), но по телефону тост говорит «1:44:32» для некоторых странная причина (и просто быть более запутанным, приложение все еще заканчивается после 00:44:32 - дополнительный час показан только в тосте). Как возможно, что одна и та же часть кода генерирует разные результаты в зависимости от того, является ли это эмулятором или телефоном?
Переменные класса, содержащий время (в упрощенном виде):
public class TimeKeeper
{
private long timeUntilTermination;
private long elapsedTime;
public long getTimeUntilTermination() {return timeUntilTermination;}
public long getElapsedTime() {return elapsedTime;}
}
Деятельность имеет статический объект хронометрист и метод:
public void startTimeCountDown()
{
timeHandler = new Handler();
timeHandler.postDelayed(new Runnable() {
// terminating
}, timeKeeper.getTimeUntilTermination() - timeKeeper.getElapsedTime());
countdownStartedAt = System.currentTimeMillis();
}
Они оба работают, как они должны. Это просто уведомление, это неправильно.
переменная timeUntiltermination устанавливается в этом методе:
private void setTimeUnilTermination()
{
long tut = (timePicker.getCurrentHour() * 3600000) +
(timePicker.getCurrentMinute() * 60000);
timeKeeper.setTimeUntilTermination(tut);
}
И метод, используемый в автосохранения, поэтому, если пользователь завершает работу и перезапускает приложение, таймер перезапустится, откуда он остановился. Истекшее время сохраняется в файле, а затем читается. Без изменений.
private void keepElapsedTimeJustInCase() {
timeKeeper.setElapsedTime(System.currentTimeMillis() - countdownStartedAt);
}
это поможет, если вы добавите то, что делают ваши методы (getTimeUntilTermination, getElapsedTime) и переменная countdownStartedAt. Имейте в виду, что System.currentTimeMillis не следует использовать для измерений с истекшим временем (вместо этого используйте nanoTime) – Raykud
Самое смешное, что все другие связанные с временем действия в моем коде работают очень хорошо. Только этот код показывает неправильное время по той причине, которую я не понимаю. Все так случайно с Android. – SpaceMonkey
Значения timeUntiltermination и elapsedTime - это значения, которые вы установили? или откуда они берутся? Я вижу, что countdownStartedAt его из System. currentTimeMillis, но другие не знают, что такое значения. – Raykud