휴대 전화의 가속도를 40ms마다 (25Hz에서) 기록하는 앱을 작성 중입니다. 이 프레임 속도는 평균으로 유지 될 수 있지만 때로는 시간 프레임 사이에서 5 분의 1 ~ 50 분의 1 초의 지연이 발생합니다. 나는 이것이 왜 일어나는지 궁금합니다. 여기가속도계 로거 : 프레임 간의 가끔 지연 발생
당신은 당신이 그들이 자주 발생하는 것을 볼 수있는 지연의 그래프를 가지고 :
- 을 : 여기
내가 (나쁜 될 수있는) 일을하고 무엇을 액티비티는 가속도계 로거 클래스 (싱글 톤, 순수 자바, 안드로이드 클래스 확장 없음)를 가리 킵니다.
- 가속도계 로거 싱글 톤은 백그라운드에서 계속 로그인합니다.
- 가속도계 로거는 모든 로그를 sqlite db에 직접 저장합니다.
- 나는 백그라운드에서 GPS 데이터도 기록하고있다.
- DAO (데이터 액세스 개체)는 모든 로그를 LinkedBlockingQueue에 할당하고 별도의 스레드에 저장합니다. 여기
내가 문제가 될 것 같아요 내용은 다음과 같습니다
- 어쩌면 내가 더 라이프 사이클 메소드를 구현하거나, 아니면 우선 순위를 설정합니다 (accererometer 로거 이익 우선 순위 있도록, 특정 안드로이드 클래스를 확장해야 어딘가에).
System.currentTimeMills()
대신event.timestamp
을 사용할 수 있습니다. (좀 센서는 서로 다른 시간대를 가지고, 내가System.currentTimeMillis()
를 사용하는 이유 먹으 렴하지만, 필요한 경우 I 스위치 것,이 일을하지 않으려는 것입니다.)
당신이 나 제안 어떤 경험이 있나요 어디에 문제가 수 아마 거짓말?
@SuppressLint("NewApi")
public class AccelerometerLogger implements SensorEventListener {
private static AccelerometerLogger singleton = new AccelerometerLogger();
private LoggerDao loggerDao;
private SensorManager sensorManager;
private Sensor accelerometer;
private double acceleorometerRate = 25; // Hz
int accelerometerDelayMicroseconds = (int) (Math.round(((1/this.acceleorometerRate)*1000000.0)));
private AccelerometerLogger()
{
this.loggerDao = LoggerDao.getInstance();
}
public static AccelerometerLogger getInstance()
{
return singleton;
}
public void start(Context context)
{
this.sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
this.accelerometer = this.sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
int accelerometerMinDelay = this.accelerometer.getMinDelay();
//Log.d("lggr-r", "desired delay: "+this.accelerometerDelayMicroseconds+" microseconds");
//Log.d("lggr-r", "provided min delay: "+accelerometerMinDelay+" microseconds");
if(accelerometerMinDelay < this.accelerometerDelayMicroseconds)
{
this.sensorManager.registerListener(this, this.accelerometer, this.accelerometerDelayMicroseconds);
//Log.d("lggr-r", "listener registered for desired rate: "+this.acceleorometerRate+"Hz (delay of "+this.accelerometerDelayMicroseconds+" microseconds).");
}
else if(accelerometerMinDelay==0)
{
this.sensorManager.registerListener(this, this.accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
// Log.d("lggr-r", "listener registered for streaming api. only changes will be notified (interrupt).");
}
else
{
int providedRate = (int) Math.round(1/(accelerometerMinDelay/1000000.0));
this.sensorManager.registerListener(this, this.accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
// Log.d("lggr-r", "can't read at the desired rate ("+this.acceleorometerRate+"Hz), app will read at "+providedRate+"Hz instead (delay of "+accelerometerMinDelay+" microseconds).");
}
}
public void stop()
{
this.sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
// String name = sensor.getName();
// Log.d("lggr", "the accurracy of "+name+" changed to "+accuracy+".");
}
@Override
public void onSensorChanged(SensorEvent event)
{
// lazy load loggerDao (TODO: fix all of those)
if(this.loggerDao == null)
{
this.loggerDao = LoggerDao.getInstance();
}
String values = "";
for(float value : event.values) values += value+",";
values = values.substring(0,values.length()-2);
// long timestamp = System.currentTimeMillis();
// Log.d("lggr", "acc = {time:"+timestamp+", data: ["+values+"]}");
AccelerometerSample accelerometerSample = new AccelerometerSample();
accelerometerSample.setTimestamp(System.currentTimeMillis());
accelerometerSample.setValues(event.values);
this.loggerDao.save(accelerometerSample);
}
}
은 분명히 문제가 단지 삼성 갤럭시 SIII 미니에 발생합니다
여기 내 코드입니다. 필자는 삼성 갤럭시 SII (맞춤 ROM)로 테스트했으며 지연 시간은 항상 0.04 초 (0.005 ~ 0.12 초)였습니다.
삼성 갤럭시 SIII 미니에서 이러한 현상이 발생하는 이유는 무엇입니까?
업데이트 : event.timestamp
크게 지연을 개선 사용할 목적의
벤 Voigts 대답. 아직도, 나는 때때로 더 긴 지연을 경험하고있다. 내가 그들을 어떻게 더 향상시킬 수 있는지 아십니까?
센서 관리자 코드 – nayab
을 게시 할 수 있습니까? 방금 추가했습니다. – ndrizza
로깅 때문일 수 있습니다. 스레드에 데이터를 기록하십시오. –