System.currentTimeMillis() против SystemClock.elapsedRealtime()

Вы когда-нибудь пробовали рассчитать время между двумя событиями? Обычно для этого используют System.currentTimeMillis(), но я рекомендую вместо этого познакомиться с SystemClock.elapsedRealtime().

System.currentTimeMillis() вернет стандартное “настенное” время, выраженное в милисекундах. Это время, к несчастью, может быть изменено через сеть или пользователем вручную (смотри setCurrentTimeMillis(long)), что приводит к видимым скачкам.

SystemClock.elapsedRealtime() возврщает время с момента запуска системы, включая режим глубокого сна. Эти часы гарантированно монотонны и продолжают идти даже когда процессор находится в режиме энергосбереженя. elapsedRealtimeNanos() можно использовать для получения настоящего времени в наносекундах.

Например, необходимо посчитать время исполнения алгоритма

long startTime = System.currentTimeMillis();
// какой-то код
long endTime = System.currentTimeMillis();

для этого нужно засечь время в начале алгоритма, после его исполнения и вычислить разницу.

long duration = endTime - startTime; 

Что произойдет если мы попробуем установить время между вызовами? Ничего хорошего :-(

Используйте SystemClock.elapsedRealtime() вместо System.currentTimeMillis() чтобы не зависеть от методов, способных выставить время вручную.

Модифицируем программу верно:

long startTime = SystemClock.elapsedRealtime();
// какой-то код
long endTime = SystemClock.elapsedRealtime();
long duration = endTime - startTime;