처음 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씩 더해주는 방법으로 문제를 해결할 수 있었다.

로그를 찍어보면