RxJava2, RxAndroid2

RxAndroid2 중간에 멈출 수 있는 타이머만들기! Observable.interval

알통몬_ 2019. 5. 20. 09:47
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


오랜만에 RxAndroid2 카테고리에 포스팅을 합니다.

예전에 Observable.interval()메소드를 통해 

타이머를 만드는 방법에 대해포스팅했었는데요.

2018/10/10 - [RxJava2, RxAndroid2] - [RxAndroid2] Timer, TimerTask, CountDownTimer -> RxAndroid 로 바꿔보기


이번에는 이 타이머를 중간에 멈췄다가 

다시 재생하는 방법에 대해 포스팅합니다.


방법은 정말 간단합니다. 

boolean 필드와 int 필드를 하나씩만 추가하면 끝입니다.

private int seconds;
boolean isDialogShow;

private void timer() {
Log.e("timer()", "started");
Observable<Long> duration = Observable.interval(1, TimeUnit.SECONDS)
.map(sec -> sec += 1);
Disposable disposable = duration.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(timeout -> {
Log.e("isDialogShow", String.valueOf(isDialogShow));
seconds++;
if (isDialogShow) seconds--;
Log.e("seconds", seconds + "");
if (seconds == TIMEOUT) {
// 원하는 작업
}

});
mCompositeDisposable.add(disposable);

}

위 timer() 메소드를 보시면 1초마다 sec += 1을 합니다.

그러면 이제 1초에 한 번씩 subscribe(timeout -> {});

이 실행되겠죠? 여기에서 seconds 값을 ++로 1씩 추가합니다.

그럼 결국 seconds 가 1초에 1씩 증가하겠죠?

이로써 먼저 타이머의 기능을 timeout이 아닌 seconds 필드가 담당하는 걸로

대체하였습니다. 그리고 저의 경우 다이얼로그가 떴을 때 타이머가 잠시 멈추는 걸

구현하고 싶었기 때문에 boolean isDialogShow 필드를 추가했습니다.

그리고 isDialogShow 가 true 일 경우 저 timeout의 값은 변경할 수 없기 때문에

타이머값인 seconds를 한 줄위에서 ++한 걸 다시 -- 함으로 결론 적으로 시간이 멈춘 

것처럼 동작하게 하였습니다.

물론 더 좋은 방법이 있겠지만, 저의 경우는 이렇게 만들었습니다.

타이머가 중간에 멈추는 기능을 구현하시려는 분들에게 도움이 되었길 바라며

이상으로 포스팅을 마칩니다.

감사합니다.

반응형