반응형
[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]
본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다
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 |