Как измерить прошедшее время

У меня есть 10 и 20 вопросов. Мне нужно подсчитать, сколько времени прошло, когда пользователь заканчивает игру.

Timer T=new Timer(); T.scheduleAtFixedRate(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { public void run() { countdown.setText(""+count); count++; } }); } }, 1000, 1000); 

Я использую это, чтобы остановить счетчик:

 T.cancel(); 

Теперь мне нужны две вещи:

  • Способ подсчета прошедшего времени и сохранения его в переменной
  • Мне нужно, чтобы последнее значение было двойным, например, итоговый балл: 15,49 секунды.

Solutions Collecting From Web of "Как измерить прошедшее время"

Когда игра начинается:

 long tStart = System.currentTimeMillis(); 

Когда игра заканчивается:

 long tEnd = System.currentTimeMillis(); long tDelta = tEnd - tStart; double elapsedSeconds = tDelta / 1000.0; 

В Android- документах SystemClock.elapsedRealtime() является рекомендуемой основой для синхронизации времени общего назначения. Это связано с тем, что в соответствии с документацией elapsedRealtime () is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.

В документации SystemClock имеется хороший обзор различных методов времени и применимых вариантов использования для них.

  • SystemClock.elapsedRealtime() и SystemClock.elapsedRealtimeNanos() – лучшая ставка для расчета общего времени прошедшего времени.
  • SystemClock.uptimeMillis() и System.nanoTime() – это еще одна возможность, но в отличие от рекомендуемых методов они не включают время глубокого сна. Если это ваше желаемое поведение, то они подходят для использования. В противном случае придерживаться elapsedRealtime() .
  • Держитесь подальше от System.currentTimeMillis() как это вернет «настенные» часы. Это не подходит для расчета истекшего времени, так как время настенных часов может перемещаться вперед или назад. Это приведет к тому, что расчеты с currentTimeMillis() временем, основанные на currentTimeMillis() не всегда будут точными.

Когда игра начинается:

 long startTime = SystemClock.elapsedRealtime(); 

Когда игра заканчивается:

 long endTime = SystemClock.elapsedRealtime(); long elapsedMilliSeconds = endTime - startTime; double elapsedSeconds = elapsedMilliSeconds / 1000.0; 

Кроме того, таймер () является лучшим таймером усилия и не всегда будет точным. Таким образом, будет происходить накопление временных ошибок в течение всего времени игры. Для более точного отображения промежуточного времени используйте периодические проверки в System.currentTimeMillis() в качестве основы времени, отправленного в setText(...) .

Кроме того, вместо использования Timer вы, возможно, захотите изучить использование TimerTask , этот класс предназначен для того, что вы хотите сделать. Единственная проблема заключается в том, что он рассчитывает вместо up, но это можно решить с помощью простого вычитания.

Даже лучше!

 long tStart = System.nanoTime(); long tEnd = System.nanoTime(); long tRes = tEnd - tStart; // time in nanoseconds 

Прочтите документацию о nanoTime ()!