본문 바로가기
Rx

RxJava 흐름제어 -5(debounce 함수)

by 봄석 2019. 1. 1.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




debounce() 함수

debounce() 함수는 빠르게 연속 이벤트를 처리하는 흐름 제어 함수입니다. 

POJO java와 같이 콘솔에서는 크게 활용할 일이 없으나 안드로이드와 같은 UI 기반의 프로그래밍에서는 유용하게 활용할 수 있습니다.


예를 들어 버튼을 빠르게 누른 상황에서 마지막에 누른 이벤트만 처리해야 할 때 간단하게 적용할 수 있습니다. RxJava를 이용하지 않는다면 마지막에 버튼을 누른 시간을 멤버 변수에 저장하고 일정 시간 동안 if 문으로 예외처리 해야하기 때문에 번거롭고 실수할 가능성도 큽니다.


debounce() 함수의 마블 다이어 그램


출처 - http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html


앞 그림의 원을 버튼 이벤트라고 생각하면 이해하기 쉬울겁니다.

빨간원은 지정한 시간 간격 안에 들어왔고 다른 이벤트는 없어서 그대로 발행되었습니다. 노란 원의 경우 시간 간격안에 초록원이 다시 들어왔으므로 노란원을 발행하지 않고 초록원만 발행했습니다. 


debounce() 함수의 원형

@SchedulerSupport(SchdulerSupport.COMPUTATION)

public final Observable<T> debounce(long timeout, TimeUnit unit)


debounce () 함수는 계산 스케줄러에서 동작합니다 . 어떤 이벤트가 입력되고  timeout에서 지정한 시간동안 추가 이벤트가 발생하지 않으면 마지막 이벤트를 최종적으로 발행합니다.


debounce() 함수 활용 예

String[] data = {"1", "2", "3", "5"};
        
Observable<String> source = Observable.concat(
        Observable.timer(100L, TimeUnit.MILLISECONDS).map(i -> data[0]),
        Observable.timer(300L, TimeUnit.MILLISECONDS).map(i -> data[1]),
        Observable.timer(100L, TimeUnit.MILLISECONDS).map(i -> data[2]),
        Observable.timer(300L, TimeUnit.MILLISECONDS).map(i -> data[3]))
.debounce(200L, TimeUnit.MILLISECONDS);
        
source.subscribe(Log::i);
CommonUtils.sleep(1000);
CommonUtils.exampleComplete();



위 코드는 데이터를 발행하는 부분이 특이합니다. 각각의 시간 간격이 서로 다르므로 concat() 함수를 활용하여 각각 데이터를 발행했습니다. timer() 함수는 이벤트를 한 번만 발생시키고 완료하기 때문에 concat() 과 timer()함수의 조합은 유용합니다.

debounce() 함수를 활용하여 200ms 안에 더이상 이벤트가 발생하지 않으면 마지막 입력된 값을 발행하도록 했습니다.


실행결과

RxComputationThreadPool-2 | value = 1
RxComputationThreadPool-2 | value = 3
RxComputationThreadPool-2 | value = 5

-----------------------



댓글