본문 바로가기
2023년 이전/ReativeX

RxJava,RxKotlin - interavlRange()

by JeongUPark 2019. 12. 16.
반응형

[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]

본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다



마블다이어그램 참고 - http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#intervalRange-long-long-long-long-java.util.concurrent.TimeUnit-

 

intervalRange는 interval 함수와 range 함수를 혼합해놓은 함수입니다. interval 함수 처럼 일정시간 간격으로 range함수 처럼 시작 숫자로부터 m 개만큼 값을 생성하고 onComplete 이벤트가 발생합니다. 즉, interval 처럼 무한히 데이터를 발행하지 않습니다.

 

 

interval을 간단하게 사용해보면

Java

import io.reactivex.Observable;

import java.util.concurrent.TimeUnit;

public class IntervalRange {

    public static void main(String[] args){
        CommonUtils.exampleStart();
        Observable source = io.reactivex.Observable.intervalRange(1,5,100L,100L, TimeUnit.MILLISECONDS);

        source.subscribe(it->{
            long time = System.currentTimeMillis() - CommonUtils.startTime;
            System.out.println(getThreadName() + " | " + time + " | " + "value = " + it);
        });
        CommonUtils.sleep(1000);
    }
    private static String getThreadName() {
        String threadName = Thread.currentThread().getName();
        if (threadName.length() > 30) {
            threadName = threadName.substring(0, 30) + "...";
        }
        return threadName;
    }
}
public class CommonUtils{
    public static long startTime;
    public static void exampleStart(){
        startTime = System.currentTimeMillis();
    }
    public static void sleep(int mills){
        try{
            Thread.sleep(mills);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

 

Kotlin

import io.reactivex.Observable
import java.util.concurrent.TimeUnit

fun main(){
    CommonUtilsk.exampleStart()
    var source = Observable.intervalRange(1,5,100L,100L, TimeUnit.MILLISECONDS)
    source.subscribe { it->
        val time = System.currentTimeMillis() - CommonUtilsk.startTime
        println(getThreadName() + " | " + time + " | " + "value = " + it)
    }
    CommonUtils.sleep(1000)

}
private fun getThreadName() : String{
    var threadName = Thread.currentThread().name
    if (threadName.length > 30) {
        threadName = threadName.substring(0, 30) + "..."
    }
    return threadName
}

결과는

RxComputationThreadPool-1 | 225 | value = 1
RxComputationThreadPool-1 | 325 | value = 2
RxComputationThreadPool-1 | 425 | value = 3
RxComputationThreadPool-1 | 524 | value = 4
RxComputationThreadPool-1 | 625 | value = 5

위의 결과를 보면 100mil 마다 값이 1,2,3,4,5가 나타납니다.

 

그리고 위에서 CommonUtils을 사용했는데 그 이유는 intervalRange 역시 range난 interval 처럼 Main Thread에서 동작하지 않고 계산스케줄러에서 실행됩니다.

 

intervalRange 원 code를 보면

 

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.COMPUTATION)
    public static Observable<Long> intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit) {
        return intervalRange(start, count, initialDelay, period, unit, Schedulers.computation());
    }

 

반응형

'2023년 이전 > ReativeX' 카테고리의 다른 글

RxJava, RxKotlin - repeat()  (0) 2019.12.16
RxJava, Rxkotlin - defer()  (0) 2019.12.16
RxJava,RxKotlin - range()  (0) 2019.12.04
RxJava, RxKotlin - timer  (0) 2019.11.20
RxJava,RxKotlin - Interval  (0) 2019.11.20