본문 바로가기

안드로이드

StateFlow를 알아가는 과정 (Flow, LiveData)

반응형

StateFlow를 알기전에

Cold? Hot? 이 뭘까?

StateFlow를 위해 Android Developer 가이드의 문서를 읽어봤을때 핫 플로우, 콜드 플로우라는 설명이 있어서 이해할 수 없었다.

이 개념은 RxJava에서 나온 개념으로 보인다.

- Cold: 호출되면 구독자가 처음부터 데이터를 발행할 수 있는 것
ㄴ ex) Flow, DB쿼리, 파일 읽기

- Hot: 구독자를 신경쓰지 않고 데이터를 계속 발행시키는 것으로 구독한 이후에 이벤트에 대해서만 알 수 있는 것
ㄴ SharedFlow, StateFlow, 마우스 이벤트, 키보드 이벤트

하나의 스트림을 여러번 Subscibe해야 하는 경우에는 Hot Observable을 사용하자

Flow에 대해서 알아보자

- Kotlin에서 Flow는 비동기로 동작하면서 여러개의 값을 반환하는 Function을 만들 때 사용하는 Builder이다.
- emit() 함수를 사용해 방출
- Sequence와 동일하게 콜드 스트림이다.
- 선언적이다. ( 계속 들어오는 데이터를 처리하라 수 없다.)
- 안드로이드 라이프 싸이클에 대해서 알 수 없다. (LifeCycleCoroutinScope를 확장해서 해결 가능)
- 매번 수집할 때마다 새로 시작한다.

StateFlow vs LiveData

일단 두가지는 용도가 다르다고 볼 수 있다.

LiveData는 UI에 밀접하게 붙어있고 UI가 없는 워크 쓰레드에서 라이브데이터를 쓸 수 있는 자연스러운 방식이 없다.
Clean ArchiTecture 용어로 설명하자면 LiveData는 프레젠테이션 레이어에서는 잘 동작하지만 도메인 레이어 플랫폼(= 플랫폼과 무관한, 순수한 코틀린/ 자바 모듈), 데이터레이어(레포지터리와 데이터소스)에서는 일반적으로 쓰기 어렵다. (워커쓰레드에서 UI 없이 동작하기 때문)
이 때문에 나온 것이 StateFlow라고 보면 된다.

StateFlow

- StateFlow는 현재 상태와 새로운 상태 업데이트를 수집기에 내보내는 식별 가능한 상태 홀더 Flow다.
-MutableStateFlow가 업데이트 당당하는 클래스 생산자이고 StateFlow에서 수집되는 모든 클래스가 소비자다.
- collect를 시작하면 스트림의 마지막 상태와 후속 상태가 수신된다. LiveData 같은 다른 식별 가능한 클래스에서 이 동작을 찾을 수 있다.
- 값이 업데이트 된 경우에만 반환하고 동일한 값을 반환하지 않는다.
- Android에서 StateFlow는 식별 가능한 변경 가능 상태를 유지해야 하는 클래스에 적합하다.

SharedFlow

  • SharedFlow는 StateFlow의 일반화로 생각
  • StateFlow는 기본적으로 새 구독자가 있을 때 마지막으로 알려진 값을 내보낸다. SharedFlow를 사용하면 내보낼 이전 값 수를 구성할 수 있다.
  • 값의 버퍼가 가득 차면 어떤 일이 발생하는지 정의할 수 있다.
  • LiveData가 쉽게 수행할 수 없는 고급 사용 사례에 대해 뛰어난 유연성을 제공한다.
  • replay = 0 : 새로운 구독자에게 이전 이벤트를 전달하지 않음
  • extraBufferCapacity = 1 : 추가 버퍼를 생성하여 emit 한 데이터가 버퍼에 유지되도록 함
  • onBufferOverflow = BufferOverflow.DROP_OLDEST : 버퍼가 가득찼을 시 오래된 데이터 제거

 

 

https://all-dev-kang.tistory.com/entry/Rx프로그래밍-뜨거운Hot-Observable-Vs-차가운Cold-Observable에-대해

https://stanleykou.tistory.com/entry/httpsproandroiddevcomshould-we-choose-kotlins-stateflow-or-sharedflow-to-substitute-for-android-s-livedata-2d69f2bd6fa5

 

[Rx프로그래밍] 뜨거운(Hot) Observable Vs 차가운(Cold) Observable에 대해

Observable 에는 두가지 종류의 Hot Cold 가 있습니다. 차가운 Observable는 선언하고 just( ), fromIteralbe( ) 함수를 호출해도 옵서버가 subscribe( ) 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않습..

all-dev-kang.tistory.com

 

반응형

'안드로이드' 카테고리의 다른 글

Looper와 Handler  (0) 2021.12.15
안드로이드 호환성 모드  (0) 2021.12.02
Dagger2 - Android  (0) 2021.04.22
안드로이드 include vs merge 태그 차이  (0) 2021.04.14
AlertDialog  (0) 2021.03.21