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

RxJava, RxKotlin - timer

by JeongUPark 2019. 11. 20.
반응형

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

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



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

 

timer는 interval 함수와 유사하지만 한번만 실행하는 함수입니다. 일정 시간 지난 후 한번만 발행하고 onComplete 이벤트를 발생시킵니다.

timer의 원본 code를 보면

@SchedulerSupport(SchedulerSupport.COMPUTATION)
public static Observable<Long> timer(long delay, TimeUnit unit) {
    return timer(delay, unit, Schedulers.computation());
}

interval 함수와 유사함을 확인 할 수 있습니다.

 

그럼 예제code를 확인 해보겠습니다.

JAVA

import io.reactivex.Observable;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Timer_test{
    public static void main(String[] args){

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

        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.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.TimeUnit

fun main(){
    CommonUtilsk.exampleStart()
    val source = Observable.timer(500L, TimeUnit.MILLISECONDS).map { it ->
        SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
            Date()
        )
    }

    source.subscribe { it ->
        val time = System.currentTimeMillis() - CommonUtilsk.startTime
        println(getThreadName() + " | " + time + " | " + "value = " + it)
    }
    CommonUtilsk.sleep(1000)
    
}
fun getThreadName() : String{
    var threadName = Thread.currentThread().name
    if (threadName.length > 30) {
        threadName = threadName.substring(0, 30) + "..."
    }
    return threadName
}
internal object CommonUtilsk {
    var startTime: Long = 0
    fun exampleStart() {
        startTime = System.currentTimeMillis()
    }

    fun sleep(mills: Int) {
        try {
            Thread.sleep(mills.toLong())
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }

    }
}

 실행 하면

RxComputationThreadPool-1 | 686 | value = 2019/11/20 18:03:08

이렇게 1개의 결과만 약 500millis 있다가 나타나는 것을 확인 할 수 있습니다.

반응형

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

RxJava,RxKotlin - interavlRange()  (0) 2019.12.16
RxJava,RxKotlin - range()  (0) 2019.12.04
RxJava,RxKotlin - Interval  (0) 2019.11.20
RxJava,RxKotlin - reduce  (0) 2019.11.13
RxJava, RxKotlin - filter  (0) 2019.11.13