작업 목표
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");
}
}
'JAVA > Android' 카테고리의 다른 글
[JAVA][Android] ImageView 영역에 원하는 radius값을 반영하는 setOutlineProvider (0) | 2022.06.21 |
---|---|
[JAVA][Android] ProgressBar 디자인 java 코드로 변경하기 (+ 변경 시 비가시화 처리 되는 현상 해결방법) (0) | 2022.05.26 |
[JAVA][Android] ProgressBar 부드럽게 증가/감소 시키기 : ObjectAnimator 활용 (0) | 2022.05.18 |
[JAVA][Android] 로컬 파일(png, webp 등)의 Uri 추출하기 (0) | 2022.05.17 |
[JAVA][Android] webp 동영상(gif) 재생 횟수 정하기 (1) | 2022.05.17 |