본문 바로가기

JAVA/Android

[JAVA][Android] CountDownTimer 작동과 일시정지/재시작

작업 목표
CountDownTimer 객체 하나를 가지고 반복적으로 일시중지/재시작 하기

이슈 경로
1. CountDownTimer를 전역으로 선언
2. 타이머 객체를 재시작하는 메서드를 하나 생성하여 내부에서

countDownTimer = new CountDownTimer

타이머 객체를 새로 생성함.
(일시 중지하는 시점의 시간을 저장하는 것은 해결방안에 따로 기록하겠음)
3. 타이머를 일시 중지하는 로직은

if(countDownTimer!=null){
    countDownTimer.cancel();
    countDownTimer = null;
}

위와 같이 작성하였음.

이슈 내용과 원인
타이머 객체를 전역으로 선언한 뒤 일시중지 할 경우 cancel 처리를 함에도 불구하고 타이머 객체가 초기화되지 않고,
재시작을 할 때마다 타이머 객체가 새롭게 생성되어 유기적으로 작동하지 않음

수정 사항
위와 같이 타이머 객체가 중복 생성되는 경우를 대비하기 위하여,
타이머의 [일시중지(false)/재시작(true)] 을 flag로 받아 처리하는 메소드를 하나 작성함.

소스 정리
1. 아래와 같이 타이머 객체를 전역으로 선언함
time 변수는 시간을 일시 정지 했을 때 현재 시간 정보를 저장해두기 위한 변수이다.
해당 변수를 이용하여 멈춘 시간부터 타이머를 다시 재생한다.

public static CountDownTimer countDownTimer;
public static long time;

time의 초기값은 타이머 설정 시간으로 작성하면 된다.

타이머를 2분으로 설정할 경우 예시)

@Override
protected void onCreate(Bundle savedInstanceState) {
	time =  60 * 2 * 1000;
}

 

2. 타이머를 중지/재시작하는 메서드 작성

public void setTimer(boolean isTimerWorking){

    if(isTimerWorking){
    /**매개변수가 true로 들어왔을 경우 : 재시작*/
    
    /*전역 변수인 countDownTimer가 null이 아니라면 cancel, null 처리를 해줌으로서
      객체가 중복 생성되지 않도록 한다.*/
        if(countDownTimer!=null){
            countDownTimer.cancel();
            countDownTimer = null;
        }

    /*타이머를 재정의한다*/
    //여기서 time은 타이머를 설정한 시간으로, 1초(COUNT_DOWN_INTERVAL)가 지날 때마다 갱신한다.
        countDownTimer = new CountDownTimer(time,COUNT_DOWN_INTERVAL) {
            @Override
            public void onTick(long l) {

                time = l;

				/**시간 정보는 1초 = 1000 으로 들어오기 때문에
                타이머에 들어오는 l값을 1000으로 나눈 값을 저장한다.*/
                long timeProgress = l/1000;

				
				/**아래는 현재 시간을 00:00 형식으로 표시하기 위한 로직이다.*/
                int minutes = (int) ((timeProgress % 3600) / 60);
                int seconds = (int) (timeProgress % 60);

                String timeString = String.format("%02d:%02d", minutes, seconds);

                txtView.setText(timeString);
            }
        }.start(); /**작성과 동시에 시작하도록 한다.*/
        LogUtil.d("log","[TIMER] setTimer : countDownTimer is start");
    } else {
    /**매개변수가 false로 들어왔을 경우 : 일시중지*/
    /**onTick에 들어올 때마다 time에 현재 남은 시간을 저장해 두었으므로 
       일시중지할 때에는 다른 처리가 필요하지 않다.*/
        if(countDownTimer!=null){
            countDownTimer.cancel();
            countDownTimer = null;
        }
        LogUtil.d("log","[TIMER] setTimer : countDownTimer is cancel");
    }
}