본문 바로가기
Rx

리액티브연산자[생성연산자]-7(interval함수)

by 봄석 2018. 12. 26.

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

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

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




리액티브 연산자(함수) 분류 - 카테고리

연산자 종류 

연산자 함수 

  생성 연산자 


 just(), fromXXX(), create(), interval(), ragne(), timer(),   intervalRange(), defer(), repeat() 


  변환 연산자


 map(),flatMap(), concatMap(), switchMap() , groupBy(),

 scan(), buffer(), window()


  필터 연산자


 filter(), take(), skip(), distinct()


  결합 연산자

 

 zip(), combineLatest(), merge(), concat()

 

  조건 연산자


 amb(), takeUtil(), skipUtil(), all()

 

  에러 처리 연산자 


 onErrorReturn(), onErrorResumeNext(), retry(), retryUntil()


  기타 연산자 

 

 subscribe(), subscribeOn(), observeOn(), reduce(), count()

 



생성연산자 - interval()함수

interval() 함수는 일정 시간 간격으로 데이터 흐름을 생성합니다.


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

출처 - http://reactivex.io/documentation/operators/interval.html


interval() 함수는 주어진 시간 간격으로 0부터 1씩 증가하는 Long객체를 발행합니다.

주로사용하는 함수의원형은 두개가 있습니다.

1
2
3
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public static Observable<Long> interval(long period, TimeUnit unit)
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit)
cs
첫번째 원형은 일정시간(period)를 쉬었다가 데이터를 발행합니다

두번째 원형은 동작은 같고 최초 지연시간(initialDelay)를 조절할 수 있습니다.

보통 초기 지연시간 없이 (initialDelay를 0으로 입력함) 바로 데이터를 발행하기 위해서 사용합니다.


@SchedulerSupport(ShcedulerSupport.COMPUTATION) 애너테이션은 interval() 함수의 동작이 계산 스케줄러에서 실행된다는 의미입니다. 현재의 스레드가 아니라 계산을 위한 별도의 스레드에서 동작한다고 생각하면 됩니다.


interval() 함수는 기본적으로 영원히 지속 실행되기 때문에 폴링 용도로 많이 쓰입니다


interval()함수의 활용 예

CommonUtils.exampleStart();

Observable<Long> source=Observable.interval(100L, TimeUnit.MILLISECONDS)
            .map(data->(data+1)*100)
            .take(5);

source.subscribe(Log::it);

CommonUtils.sleep(1000);
/*위의 작업은 mainThread가 아닌 workThread에서 동작한다
* sleep()을 호출해주지않으면 mainThread는 할일 이 없기 때문에 프로그램이 바로 종료된다.
*/

실행결과
RxComputationThreadPool-1 | 398 | value = 100
RxComputationThreadPool-1 | 500 | value = 200
RxComputationThreadPool-1 | 599 | value = 300
RxComputationThreadPool-1 | 698 | value = 400
RxComputationThreadPool-1 | 800 | value = 500


Observable인 source 변수는 100ms 간격으로 0부터 데이터를 발행한 후 map()함수를 호출하여 입력값에 1을 더하고 100을 곱합니다.

따라서 100,200,300...등의 데이터를 발행합니다. take() 는 최초 5개의 데이터만 취급합니다.


CommonUtils.exampleStart();에서는 System.currentTimeMillis()를 호출하여

시작시간을 밀리세컨드 측정합니다.

Log::it에서는 System.currentTimeMillis() - 위에서 측정한 시작시간 을 계산하여

long 으로 저장합니다.

결과값에서 value 이전에 두번째 값이 그결과로 ms로 보이게됩니다.


sleep(1000)을 해주는 이유는 interval작업이 main 스레드가 아니라 work 스레드에서 이루어지므로

sleep을 해주지않으면 main 스레드는 할일이 없는것으로 간주하고 프로그램을 바로 종료하기 때문입니다.



interval() 함수의 두번째 원형 활용 예

CommonUtils.exampleStart();

Observable<Long> source= Observable.interval(0L,100L,TimeUnit.MILLISECONDS)
           .map(val->val+100)
           .take(5);

source.subscribe(Log::it);

CommonUtils.sleep(1000);

실행결과


RxComputationThreadPool-2 | 1 | value = 100
RxComputationThreadPool-2 | 101 | value = 101
RxComputationThreadPool-2 | 202 | value = 102
RxComputationThreadPool-2 | 301 | value = 103

RxComputationThreadPool-2 | 401 | value = 104

첫번째 예제와 비교했을때 initialDelay 인자만 0L로 입력한 것을 제외하면 다른 내용은 같습니다.

실행결과를 보면 첫 시간값이 398에서 1로 줄었습니다. 초기 지연값이 0ms로 줄었기 때문입니다.

댓글