처음 onCreate()에서
startTime = System.currentTimeMillis();
이렇게 받아서 초기 시간을 저장해놓고
매 1초마다
public void startTimer() {
timerRunnable = new Runnable() {
@Override
public void run() {
long elapsedTime = System.currentTimeMillis() - startTime;
Log.d("로그", String.valueOf(elapsedTime));
updateRunDetailList(elapsedTime);
Intent intent = new Intent(TIMER_BR);
intent.putExtra("elapsedTime", elapsedTime);
sendBroadcast(intent);
// 1초마다 현재 Runnable을 다시 실행하도록 예약
timerHandler.postDelayed(this, 1000);
}
};
timerHandler.post(timerRunnable);
}
해당 메서드를 불러서 시간을 1초씩 늘리는 방법으로 계산을 했었다.
오차가 조금씩 발생하면서 약 70~100초 간격마다 1초가 더해지는 문제가 발생했다.
이게 치명적인 문제였던 게, 리스트에 1초마다 데이터를 넣는데 1초가 건너뛰면서 전체 데이터의 개수가 줄어드는 문제가 발생했었다.
이 문제를 해결하기 위해서
public void startTimer() {
curTime = System.nanoTime();
startTime = curTime;
timerRunnable = new Runnable() {
@Override
public void run() {
long elapsedTime = curTime - startTime;
Log.e("curTime", String.valueOf(curTime));
Log.e("elapsedTime", String.valueOf(elapsedTime));
updateRunDetailList(elapsedTime);
Intent intent = new Intent(TIMER_BR);
intent.putExtra("elapsedTime", elapsedTime);
sendBroadcast(intent);
// 1초마다 현재 Runnable을 다시 실행하도록 예약
timerHandler.postDelayed(this, 1000);
curTime++;
}
};
timerHandler.post(timerRunnable);
}
curTime과 startTime을 같은 초기시간으로 설정해놓고
curTime에는 정수로 1씩 더해주는 방법으로 문제를 해결할 수 있었다.
로그를 찍어보면