Что возвращает System.nanoTime() в Android?

У меня есть куча мероприятий, связанных друг с другом, и так далее. Теперь во время одного занятия я хочу измерить прошедшее время. Как я понимаю, я бы использовал System.nanoTime() чтобы найти время начала, пользователь делает некоторые вещи, а затем использует его еще раз, чтобы найти время окончания, вычесть два и вуаля мое затраченное время, затраченное на деятельность. Но предположим, что что-то происходит, когда моя деятельность выполняется: я уже создал время начала, но теперь пользователь получает телефонный звонок или что-то в этом роде, моя деятельность переводится в фоновый режим. Телефонный звонок заканчивается, и пользователь возвращается к активности. Таймер работал все время, даже когда приложение было в фоновом режиме? Таймер сбрасывается с тех пор, как я покинул приложение и вернулся к нему?

Кроме того, когда я начинаю System.nanoTime() Возвращает ли оно время с начала этой конкретной деятельности или основной деятельности?

РЕДАКТИРОВАТЬ: Предположим, я установил первую отметку в определенной точке, затем приложение переходит в фоновый режим, затем возвращается на передний план, и я установил вторую отметку. В идеале я хочу, чтобы время прошло вместе с временем, проведенным в фоновом режиме; делает System.nanoTime() достичь этого?

3 ответа

Решение

Вам нужно будет переопределить методы onPause() и onResume() в классе Activity, чтобы вы могли поставить таймер на паузу. и резюме в onResume.

Вы должны поместить System.nanoTime() в onResume()

static long nanoTime():

Возвращает текущую метку времени наиболее точного таймера, доступного в локальной системе.

Вы не используете "Таймер" (т. Е. Объект с любым состоянием) для представления прошедшего времени, вы просто держитесь долго. Как вы указали, в какой-то момент в будущем вы снова вызовете System.nanoTime() и вычтете, чтобы найти истекшее время.

Если вы хотите исключить время, потраченное вне этой деятельности, как, например, в вашем вопросе, вам нужно будет использовать onPause() а также onResume() чтобы помочь вам управлять расчетами. Или, если вы переключаетесь на какой-либо объект таймера, используйте эти методы, чтобы приостановить и возобновить таймер.

Вы можете "запустить" свой "таймер" там, где, по вашему мнению, имеет смысл. Если это когда пользователь инициирует какое-либо действие (например, нажатие кнопки), добавьте его в OnClickListener. Если это просто для измерения продолжительности пути какого-либо метода / кода, сделайте это в начале этого.

В соответствии с документом

System.nanoTime() возвращает текущее значение наиболее точного доступного системного таймера в наносекундах.

Так что это не таймер. Он просто возвращает системное время в нано секундах. Это не имеет отношения к деятельности.

Если вы хотите измерить время жизни, найдите время в onCreate и onDestroy. И если вы хотите, чтобы время знало, сколько времени занятие было на переднем плане, получите время в onResume и onPause.

Другие вопросы по тегам