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

У меня есть 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 секунды.

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

 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 ()!

  • AlertDialog с пользовательским представлением: изменение размера, чтобы обернуть содержимое представления
  • Ковариация, инвариантность и контравариантность объясняются на простом английском языке?
  • Как отображать навигационный ящик во всех действиях?
  • Dx bad class file magic (cafebabe) или версия (0033.0000) с ADK14
  • Безопасная публикация HTTP на Android
  • Как передать функцию в качестве параметра в Java?
  • Есть ли способ разбивки запросов путем комбинирования курсоров запросов с использованием FirestoreRecyclerAdapter?
  • Как использовать векторные чертежи в Android API ниже 21?
  • Папка SRC в Eclipse пуста (class MainActivity не создан) после создания нового проекта андроида с использованием Eclipse
  • Доступ к мультимедийному streamу Android для аудиовизуализации
  • Почему я не могу использовать метод overulateViewHolder override?
  • Interesting Posts

    Неавторизованное устройство Bluetooth поддерживает подключение к Mac

    Улучшен формат цитирования APA в Word 2007/2010?

    Как я мог безопасно исправить мою ходячую ошибку «мертвого пикселя»?

    удалите приложение с помощью системных привилегий

    Как удалить папку, которая используется?

    Построение комбинированного armv7 / x86 apk после интеграции Crosswalk в проект Ionic

    Автоматическая всплывающая клавиатура при запуске

    Как получить разрешение приложения для каждого приложения? как сделать это программно на Android?

    Тестирование Android AsyncTask с помощью Android Test Framework

    android MapView в fragmentе

    WPF: как настроить SelectionBoxItem в ComboBox

    Как я могу получить количество строк текстового файла?

    Не удалось загрузить файл или сборку. Microsoft.SqlServer.management.sdk.sfc версия 11.0.0.0

    Как я могу управлять звуковыми томами в моем приложении Android?

    Что такое хороший способ отключения streamов, заблокированных на NamedPipeServer # WaitForConnection?

    Давайте будем гением компьютера.