Я пытаюсь получить время из Интернета и не хочу использовать время устройства. Я выполняю следующий запрос клиента sntp на время, но, как и ожидалось, полученное время неточно из-за времени запроса-ответа. Как преодолеть латентность и получить максимальное изменение +/- 20 мс ??Получение точного времени из интернета
Long time=0;
while (true) {
SntpClient client = new SntpClient();
if (client.requestTime("time-a.nist.gov",6000)) {
long now = client.getNtpTime() + SystemClock.elapsedRealtime()
- client.getNtpTimeReference();
Log.d("Time Difference", time-now+"");
time=now;
Thread.sleep(5000);
}
}
Файл журнала выглядит следующим образом:
- 02-10 23:27:16.125: E/Time Difference(15566): -5804
- 02-10 23:27:21.449: E/Time Difference(15566): -5272
- 02-10 23:27:26.774: E/Time Difference(15566): -5358
- 02-10 23:27:32.206: E/Time Difference(15566): -5365
- 02-10 23:27:37.528: E/Time Difference(15566): -5328
- 02-10 23:27:43.056: E/Time Difference(15566): -5429
- 02-10 23:27:48.892: E/Time Difference(15566): -5694
- 02-10 23:27:54.730: E/Time Difference(15566): -5972
- 02-10 23:28:00.563: E/Time Difference(15566): -5679
- 02-10 23:28:06.096: E/Time Difference(15566): -5686
Разница во времени, как ожидается, будет постоянной 5000 в идеальном исполнении.
«Разница во времени должна быть постоянной 5000 при безупречном исполнении» - Android не является RTOS. Кроме того, 'sleep()' не является точным "при безупречном выполнении" - все, что он делает, это организовать доступ к потоку для планирования после этого количества миллисекунд. Когда поток * будет * запускать инструкции, зависит от ОС, и это будет зависеть от того, что еще происходит с устройством. – CommonsWare
Могу ли я предположить, что изменения в моих значениях обусловлены спящим(), а не латентностью? – gaurav
Я говорю, что полагаться на 'sleep()', чтобы быть точным, является ошибочным подходом к тестированию. – CommonsWare