Rxjava에서 시간을 제어하기 위해 사용되는 delay라는 유틸리티 함수가 있습니다.
특정 시간만큼 지연시켜야 하는 상황은 꽤 많이 있었는데
개인적으로 delay 사용하는데 있어서 꿀팁이였던 내용을 간단한 예시로 정리하려고 합니다.
1. Delay 함수
대표적으로 Delay 함수의 마블 다이어그램입니다.
그림에서 보듯이 설정한 시간만큼 지연 시켜주는 역할을 합니다.
만약 여러 item 들을 발행하면서 시간적으로 제어를 두고 처리해야하는 상황이라면..
해당 특성을 활용하는 방법으로 크게 3가지로 나눴습니다.
- 딜레이
- 아이템 마다 딜레이
- 특정 아이템에서의 딜레이
2. Delay 활용 : 딜레이
val items = arrayListOf("안", "녕", "하", "세", "요")
println("1초 쉬고 인사하기")
Observable.fromIterable(items)
.delay(1000L, TimeUnit.MILLISECONDS) // 1초 딜레이
.subscribe { s -> println(s) }
2023-03-06 10:33:49.188 System.out I 1초 쉬고 인사하기
2023-03-06 10:33:50.189 System.out I 안
2023-03-06 10:33:50.189 System.out I 녕
2023-03-06 10:33:50.189 System.out I 하
2023-03-06 10:33:50.189 System.out I 세
2023-03-06 10:33:50.189 System.out I 요
3. Delay 활용 : 아이템 마다 딜레이
val items = arrayListOf("안", "녕", "하", "세", "요")
println("1초씩 쉬면서 인사하기")
Observable.fromIterable(items)
.concatMap { s -> Observable.just(s).delay(1000L, TimeUnit.MILLISECONDS) }
.subscribe { s -> println(s) }
2023-03-06 10:35:39.824 System.out I 1초씩 쉬면서 인사하기
2023-03-06 10:35:40.826 System.out I 안
2023-03-06 10:35:41.827 System.out I 녕
2023-03-06 10:35:42.829 System.out I 하
2023-03-06 10:35:43.831 System.out I 세
2023-03-06 10:35:44.832 System.out I 요
4. Delay 활용 : 특정 아이템에서 딜레이
val items = arrayListOf("안", "녕", "하", "세", "요")
println("중간에 1초 쉬고 인사하기")
Observable.fromIterable(items)
.delay { s ->
if (s == items[2]) Thread.sleep(1000L)
Observable.just(s)
}
.subscribe { s -> println(s) }
2023-03-06 10:38:34.076 System.out I 중간에 1초 쉬고 인사하기
2023-03-06 10:38:34.078 System.out I 안
2023-03-06 10:38:34.078 System.out I 녕
2023-03-06 10:38:35.078 System.out I 하
2023-03-06 10:38:35.078 System.out I 세
2023-03-06 10:38:35.078 System.out I 요
[Reference]
0 comments: