Как измерить прошедшее время
У меня есть 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();
Теперь мне нужны две вещи:
- Где получить строковый литерал «UTF-8» в Java?
- Почему возникает ArrayIndexOutOfBoundsException и как его избежать в Android?
- Задание полей в LinearLayout программно
- Открыть приложение галереи с Android Intent
- Разрешение на запись на SD-карту
- Способ подсчета прошедшего времени и сохранения его в переменной
- Мне нужно, чтобы последнее значение было двойным, например, итоговая оценка: 15,49 секунды.
- Разбор строк запроса на Android
- Android: Как запустить asynctask из другого файла classа?
- Использование пользовательского шрифта в android TextView с помощью xml
- Сканер next () бросает NoSuchElementException для некоторых онлайн-компиляторов
- Невозможно создать или отредактировать виртуальные устройства Android (AVD) от Eclipse, ADT 22.6
- Невозможно создать обработчик внутри streamа, который не вызвал Looper.prepare () внутри AsyncTask для ProgressDialog
- java Как использовать classы в другом пакете?
- Объявления загружаются, но не отображаются?
Когда игра начинается:
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()
– еще одна возможность, но в отличие от рекомендуемых методов они не include время в глубоком сне. Если это ваше желаемое поведение, тогда они подходят для использования. В противном случае придерживатьсяelapsedRealtime()
. - Держитесь подальше от
System.currentTimeMillis()
как это вернет «настенные» часы. Это не подходит для расчета истекшего времени, так как время настенных часов может скачкообразно перемещаться вперед или назад. Многие вещи, такие как клиенты NTP, могут привести к тому, что часы настенных часов скачут и перекосятся. Это приведет к тому, что расчеты сcurrentTimeMillis()
временем, основанные наcurrentTimeMillis()
не всегда будут точными.
Когда игра начинается:
long startTime = SystemClock.elapsedRealtime();
Когда игра заканчивается:
long endTime = SystemClock.elapsedRealtime(); long elapsedMilliSeconds = endTime - startTime; double elapsedSeconds = elapsedMilliSeconds / 1000.0;
Кроме того, Timer () является лучшим таймером усилий и не всегда будет точным. Таким образом, будет происходить накопление временных ошибок в течение всей игры. Для более точного отображения промежуточного времени используйте периодические проверки в System.currentTimeMillis()
в качестве основы времени, отправленного в setText(...)
.
Кроме того, вместо использования Timer
вы можете изучить использование TimerTask
, этот class предназначен для того, что вы хотите сделать. Единственная проблема заключается в том, что он учитывается вместо up, но это можно решить с помощью простого вычитания.
Даже лучше!
long tStart = System.nanoTime(); long tEnd = System.nanoTime(); long tRes = tEnd - tStart; // time in nanoseconds
Прочитайте документацию о nanoTime ()!