안녕하세요.


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 사용법이 잘 못 되었다거나, 원래 이 정도 오차가 있다거나 하는 문제가 있나요.


아니면, 실제 디바이스에서 디스플레이가 꺼지고 대기상태일 때 실행되고 있는 서비스의 스케쥴링 간격이 늘어난다거나 하는 정책이 있는건가요?



감사합니다.