[Rx CheetSheet] 다중 터치 방지하기 - throttleFirst()
버튼 등에서 발생하는 터치 이벤트를 처리할 때, 반복되는 터치 이벤트를 차단해야 할 경우가 있습니다.
이 때에는 throttleFirst
연산자를 사용하면 반복되는 터치 이벤트를 효율적으로 차단할 수 있습니다.
throttleFirst
연산자는 일정 시간 구간(Timeslot) 동안 발생한 이벤트 중 첫 번째로 발생한 이벤트만 통과시키고, 나머지 이벤트를 무시합니다.
뷰 클릭 이벤트에 이 연산자를 사용하면, 일정 시간 내 첫 번째로 발생한 터치 이벤트만 처리하도록 구성할 수 있습니다.
다음 그림은 throttleFirst
연산자의 동작 방식을 보여줍니다.
이 연산자는 기본적으로 computation
스케줄러 내에서 발생하는 이벤트를 기준으로 하여 필터링을 수행합니다.
따라서, 터치 이벤트를 필터링하려면 해당 이벤트가 발생하는 쓰레드인 메인 쓰레드(Main Thread)를 기준으로 하도록 지정해야 합니다.
모니터링할 쓰레드를 포함하는 연산자 형태는 다음과 같습니다.
Observable<T> throttleFirst(long skipDuration, TimeUnit unit, Scheduler scheduler)
RxBinding과 throttleFirst
를 사용하여, 버튼 클릭 이벤트를 1초에 한 번만 받도록 구성하려면 다음과 같이 작성하면 됩니다.
Button button = ... (/* 버튼 생성 */)
Subscription s = RxView.clicks(button)
.throttleFirst(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* 버튼 클릭시 수행할 동작 지정 */);