본문 바로가기
Rx

리액티브연산자[생성연산자]-8(timer함수,range함수)

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()

 




생성연산자- timer()함수

timer()는 interval() 함수와 유사하지만 한번만 실행하는 함수입니다.
일정시간이 지난후 한 개의 데이터를 발행하고 onComplete() 이벤트가 발생합니다.


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


timer()함수의 원형은 다음과 같습니다

1
2
3
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public static Observable<java.lang.long> timer(
long delay, java.util.concurrent.TimeUnit unit)
cs

전반적으로 interval() 함수와 매우 비슷합니다. 현재 스레드가 아닌 계산 스케줄러에서 실행되는 것도 동일하고 발행되는 데이터도 interval() 함수의 첫 번째 값인 0L 입니다.


timer() 함수를 활용한 예


CommonUtils.exampleStart();

Observable<String> source= Observable.timer(500L, TimeUnit.MICROSECONDS)
.map(notUsed->{
return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());
    });

source.subscribe(Log::it);

CommonUtils.sleep(1000);



실행결과


RxComputationThreadPool-3 | 48 | value = 2018/12/26 13:25:33

timer()함수를 호출하여 500ms 후에 다음과 같은 동작을 실행합니다.

사실 timer()함수는 0L라는 값을 발행하지만 실제로 값을 map()함수에서 활용하는 것이 아니므로 현재 시각을 표시하는 람다 표현식의 인자 이름을 notUsed라고 지었습니다.

또한 메인스레드가 아닌 계산스케줄러에서 실행되기 때문에 sleep(1000)해주었습니다.




생성연산자- range()함수

range() 함수는 주어진 값(n) 부터 m개의 Integer 객체를 발행합니다. 앞서 interval()과 timer() 에서는 Long 객체를 발행했지만 range()함수는 Integer 객체를 발행하는 것이 다릅니다.


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

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


range()함수의 원형은 다음과 같습니다.


@ShcedulerSupport(SchedulerSupport.NONE)

public static Observable<Integer> range(final int start,final int count)

interval() 함수나 timer() 함수와는 다르게 스케줄러에서 실행되지 않습니다. 따라서 현재 스레드에서 실행합니다. range() 함수는 반복문( for,while문 )을 대체할 수 있습니다.


range() 함수를 이용한 반복문 대체


Observable<Integer> source=Observable.range(1, 10).filter(number->number % 2== 0);

source.subscribe(Log::i);

range()함수를 통해 1부터 10까지의 숫자를 생성합니다. 그리고 filter() 함수를 호출하여 짝수만 걸러냅니다.


실행결과

main | value = 2
main | value = 4
main | value = 6
main | value = 8

main | value = 10


댓글