안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
Service 내에서 Timer의 schedule 함수를 사용해서 돌리고 있는데 문제가 있어서 질문 올립니다.
코드는 일종의 GPS Logger 입니다.
아래 코드는 getServiceUpdateTime() 후에 실행 되어서 myLocation에 getLocation request 를 날리는 코드입니다.
private static synchronized void startMonitoringTimer(){
if(monitoringTimer == null){
monitoringTimer = new Timer();
}
monitoringTimer.schedule(new TimerTask(){
@Override
public void run() {
try {
Looper.prepare();
} catch (Exception e) {
e.printStackTrace();
}
boolean requestSuccess = myLocation.getLocation(context, locationResult, maximumWaiting); // Request
return;
}}, getServiceUpdateTime());
}myLocation에서 위치 값이 갱신되거나 maximumWaiting 시간이 지나면 locationResult의 gotLocation이 호출 됩니다.
이때 현재 위치를 저장합니다.
locationResult = new LocationResult(){
@Override
public void gotLocation(final Location location){
lastKnownLocation = location; changeServiceUpdateTime(location); startMonitoringTimer(); };
};그리고 이때 changeServiceUpdateTime()을 이용해서 위치에 따라 serviceUpdateTime을 조정합니다.
문제는 serviceUpdateTime이 정해진 값과는 다르게 TimerTask가 스케쥴 될때가 많습니다.
완전한 리얼타임이 아니기 때문에 어쩔 수 는 었겠지만 그 차이가 많이 나네요.
실제 디바이스에서 테스트한 결과
60초 정도 간격으로 serviceUpdateTime을 세팅하더라도 10분~ 20분 만에 스케쥴링 될 때가 종종 있습니다.
10시간 동안 로깅을 해봤는데, 총 63회 실행, 평균 10분 정도 만에 실행이 되었네요.
혹시 TimerTask 사용법이 잘 못 되었다거나, 원래 이 정도 오차가 있다거나 하는 문제가 있나요.
아니면, 실제 디바이스에서 디스플레이가 꺼지고 대기상태일 때 실행되고 있는 서비스의 스케쥴링 간격이 늘어난다거나 하는 정책이 있는건가요?
감사합니다.




참고로 매 실행 시 마다 스케쥴링 시간을 변경할 필요가 있기 때문에 fixedRate는 사용하기 힘들 것 같습니다.