공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
오랜만에 RxAndroid2 카테고리에 포스팅을 합니다.
예전에 Observable.interval()메소드를 통해
타이머를 만드는 방법에 대해포스팅했었는데요.
이번에는 이 타이머를 중간에 멈췄다가
다시 재생하는 방법에 대해 포스팅합니다.
방법은 정말 간단합니다.
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를 한 줄위에서 ++한 걸 다시 -- 함으로 결론 적으로 시간이 멈춘
것처럼 동작하게 하였습니다.
물론 더 좋은 방법이 있겠지만, 저의 경우는 이렇게 만들었습니다.
타이머가 중간에 멈추는 기능을 구현하시려는 분들에게 도움이 되었길 바라며
이상으로 포스팅을 마칩니다.
감사합니다.
'RxJava2, RxAndroid2' 카테고리의 다른 글
[RxJava2] Flowable 과 배압 (0) | 2018.10.12 |
---|---|
[RxJava2] 비동기 코드 테스트하기 (0) | 2018.10.12 |
[RxJava2] JUnit 5 + RxJava2 로 테스트 코드 짜기 (0) | 2018.10.12 |
[RxJava2] 흐름제어 함수 : sample(), buffer(), throttleFirst(), throttleLast(), window(), debounce() (0) | 2018.10.11 |
[RxJava2] 예외처리2 - 재시도 : retry(), retryUntil(), retryWhen() (0) | 2018.10.11 |