Я пытаюсь создать приложение для 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);
[Javadoc] (http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29): * Заставляет Runnable r быть добавлен в очередь сообщений, которая будет запущена ** после ** истекает указанное количество времени. * Так что да, оно не будет работать точно * в указанное время, как раз через некоторое время после него. – Andreas
Одна вещь, которую вы можете сделать ... создайте свой собственный «HandlerThread» и отбросьте свой «Handler». Зачем? Если вы используете конструктор по умолчанию для 'Handler', это наиболее вероятно (в зависимости от того, где вы его построите), используя поток пользовательского интерфейса. Ну, многие другие используют этот поток, поэтому ваш «Runnable» будет иметь контент с другими способами использования этого потока. –
Великий больной дайте ему попробовать! Спасибо за вашу помощь –