2016-04-27 3 views
2

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

Вот мой код:

Runnable run = new Runnable() { 
    @Override 
    public void run() { 
     Long start = SystemClock.elapsedRealtime(); 
     if (getIfRunning() == true) { 
      try { 
       if (location2 != null) { 
        Float distanceFromLast = totalDistance(location2); 
        addToDistance(distanceFromLast); 
       } 
       getCoords(); 
       mMap.clear(); 
       markOldCoords(); 
       writeCoords(); 
       setCount(); 
       updateScreen(); 
      } catch (Exception e) { 
      } 
     } 
     Long time = SystemClock.elapsedRealtime() - start; 
     handler.postDelayed(this, 1000 - time); 
    } 
}; 
handler.post(run); 
+0

[Javadoc] (http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29): * Заставляет Runnable r быть добавлен в очередь сообщений, которая будет запущена ** после ** истекает указанное количество времени. * Так что да, оно не будет работать точно * в указанное время, как раз через некоторое время после него. – Andreas

+0

Одна вещь, которую вы можете сделать ... создайте свой собственный «HandlerThread» и отбросьте свой «Handler». Зачем? Если вы используете конструктор по умолчанию для 'Handler', это наиболее вероятно (в зависимости от того, где вы его построите), используя поток пользовательского интерфейса. Ну, многие другие используют этот поток, поэтому ваш «Runnable» будет иметь контент с другими способами использования этого потока. –

+0

Великий больной дайте ему попробовать! Спасибо за вашу помощь –

ответ

5

Вообще говоря, вы не можете получить точные сроки, как это. Таймеры всегда просыпаются немного рано или поздно из-за того, что еще делает система в то время. Лучшее, что вы можете сделать, это принять, что он никогда не будет совершенным и обновит ваш код, чтобы узнать, что вы действительно вызвали.

+0

любые предложения по лучшему методу, через 5 минут это будет почти 15 секунд, что недостаточно для большинства пользователей. –

+0

@NathanMay Помните отметку * first * timestamp, а затем вычислите время ожидания от этого, чтобы предотвратить кумулятивный перекос, который вы сейчас испытываете. – Andreas

+0

@ Аndreas это не то, что я уже сделал? Я нахожу время до вызова методов после их вызова и нахождения разницы. К сожалению, новый на этом –

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