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에-대해
'안드로이드' 카테고리의 다른 글
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 |