Как получить последующие временные метки с точностью до 5 микросекунд в Android

Ниже приведен пример кода, который я использую:

 private final SensorManager mSensorManager;
 private final Sensor mAccelerometer;
 private long prevTime=0;

 public SensorActivity() {
   mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
   mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
   mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);
 }

Я требую разницу последующих значений системной метки времени в функции OnSensorChanged (событие SensorEvent) после запуска датчика .

 public void onSensorChanged(SensorEvent event) {
    long systemTimeStamp= SystemClock.elapsedRealtimeNanos();
    long timeDifference = (systemTimeStamp - prevTime) / 1000000;    //msec        
    Log.e("PROBLEM",timeDifference);
    prevTime=systemTimeStamp;
 }

Вышеуказанная разница становится равной 0 много раз в SENSOR_DELAY_FASTEST //Почему??

Разница последующих временных меток равна 0, но, согласно определению, она должна сообщать время в наносекундах, поэтому при 5 микросекундах разница не должна быть равна нулю. Как я могу получить ненулевую разницу или есть ли другой способ получить разницу системных отметок времени с точностью до 5 микросекунд.

Обратите внимание, что event.timestamp сообщает временные метки датчика, но мне нужны временные метки системы в OnSensorChanged (событие SensorEvent), чтобы измерить, насколько точны временные метки датчика, сравнивая их с фактическими системными временными метками.


person kapilgm    schedule 20.11.2015    source источник
comment
Вы говорите, что systemTimeStamp для двух последовательных обратных вызовов иногда одинаковы? Я уверен, что это то, что вы говорите, поскольку timeDefference может стать 0 при делении на 1000 000, а разница составляет менее 1 мс, но просто хочу убедиться.   -  person Kaamel    schedule 28.11.2015
comment
да, это моя проблема.. есть ли решение этой проблемы..?   -  person kapilgm    schedule 30.11.2015
comment
Позвольте мне попробовать еще раз, поскольку я не уверен, в чем проблема. Вы регистрируете значение timeDifference. Это тот, который равен 0? Если да, то это ожидаемый результат, когда фактическая разница между значениями в наносекундах меньше 1000000 наносекунд.   -  person Kaamel    schedule 30.11.2015
comment
Итак, если это ожидается, есть ли какое-либо обходное решение.   -  person kapilgm    schedule 30.11.2015
comment
Я действительно запутался. Какого именно результата вы ожидаете? Когда вы используете long, результатом является целое число, такое как 0, 1,... Что вы ожидаете от результата деления 1000 на 1000 000, отличного от 0? Или, может быть, вы пытаетесь получить дробь? В этом случае используйте float или double.   -  person Kaamel    schedule 30.11.2015


Ответы (2)


Основываясь на комментариях, вы можете попросить об этом:

public void onSensorChanged(SensorEvent event) {
  long systemTimeStamp= SystemClock.elapsedRealtimeNanos();
  double timeDifference = ((double) (systemTimeStamp - prevTime)) / 1000000d;    //msec        
  Log.e("No PROBLEM",timeDifference);
  prevTime=systemTimeStamp;
}
person Kaamel    schedule 30.11.2015