2015-02-26 3 views
0

Я разрабатываю приложение для 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); 
} 
+0

это поможет, если вы добавите то, что делают ваши методы (getTimeUntilTermination, getElapsedTime) и переменная countdownStartedAt. Имейте в виду, что System.currentTimeMillis не следует использовать для измерений с истекшим временем (вместо этого используйте nanoTime) – Raykud

+0

Самое смешное, что все другие связанные с временем действия в моем коде работают очень хорошо. Только этот код показывает неправильное время по той причине, которую я не понимаю. Все так случайно с Android. – SpaceMonkey

+0

Значения timeUntiltermination и elapsedTime - это значения, которые вы установили? или откуда они берутся? Я вижу, что countdownStartedAt его из System. currentTimeMillis, но другие не знают, что такое значения. – Raykud

ответ

0

Вам нужно использовать nowTime. И это может быть другим в других телефонах, потому что нужно настроить.

Смежные вопросы