요즘 프로그래밍 할때 비동기 처리는 거의다 코루틴으로 하는 것같은데
그중에서 리액티브 프로그래밍을 지원해주는 flow를 굉장히 많이 활용하는 것같네요.
그중에서도 stateflow와 sharedflow를 특히 많이 사용합니다.
둘은 정확히 어떤 차이이고 어떻게 활용하는게 좋을까요?
먼저 flow란 비동기적으로 값을 생성하고 소비 할 수 있는 비동기 시퀀스 입니다.
기본적을 cold stream 이어서 구독을 시작 할 때 값을 방출합니다.
지금까지는 RxJava를 많이 써왔는데 요즘은 flow가 핫해서 알아두면 무조건 도움 됩니다.
for (i in 1..3) {
delay(100)
emit(i)
}
}
fun main() {
runBlocking {
simpleFlow().collect{
println(it)
}
}
Thread.sleep(1000)
}
이처럼 연속적인 데이터 스트림을 다루기에 적합합니다.
이러한 데이터 스트림을 코루틴과 같이 사용 할 수 있으니 유행 할 수밖에 없죠
flow 중에서도 가장 많이 쓰는 종류중 하나인 stateflow입니다.
hot stream 이어서 구독을 하지않아도 값을 방출합니다.
주로 UI 같은 상태를 나타낼때 데이터 홀더 겸 사용하기도 하죠?
sealed class UI {
object Idle : UI()
object Loading : UI()
object Success : UI()
}
val uiState = MutableStateFlow<UI>(UI.Idle)
val scope = CoroutineScope(Dispatchers.IO)
fun doSomething() {
scope.launch {
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Success
}
}
fun main() {
doSomething()
uiState.onEach { ui ->
when (ui) {
UI.Idle -> println("idle Ui")
UI.Loading -> println("loading..")
UI.Success -> println("load data success")
}
}.launchIn(scope)
Thread.sleep(500)
}
이처럼 UI의 상태를 나타내거나 값을 저장하고 있어야하는 경우 사용합니다.
stateflow의 경우 방출하는 값이 현재의 상태와 같은 경우 값을 방출하지 않습니다.
fun doSomething() {
scope.launch {
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Loading
delay(200)
uiState.value = UI.Success
}
}
UI를 굳이 같은 상태로 업데이트 해줄 필요없죠?
이러한 특성 덕에 stateflow는 주로 UI의 상태를 나타내는데 이용됩니다.
sharedflow는 마찬가지로 hot stream 이지만
stateflow와 달리 현재 상태를 저장하지않고
같은 값이 들어와도 그대로 방출합니다.
val uiState = MutableSharedFlow<UI>()
fun doSomething() {
scope.launch {
delay(200)
uiState.emit(UI.Loading)
delay(200)
uiState.emit(UI.Loading)
delay(200)
uiState.emit(UI.Loading)
delay(200)
uiState.emit(UI.Loading)
delay(200)
uiState.emit(UI.Loading)
delay(200)
uiState.emit(UI.Success)
}
}
이러한 특성덕에 sharedflow는 주로 이벤트를 처리할때 사용합니다.
stateflow는 UI 상태, sharedflow는 이벤트 핸들링
요약하자면 그렇습니다.
RxJava도 좋긴하지만 코틀린에서 밀어주고 있는 flow를 놓치지 마세요!
RxJava보다 알아야하는건 적고 쓰기 더 편합니다.
flow 많이 애용합시다.