코루틴을 공부하다보면 가끔 보는 친구들입니다.
이 친구들이 뭔지 한번 보고 가겠습니다.
- 구글 공식문서
우선 구글 공식문서에서는 어떻게 설명하고 있냐하고 하면
stateFlow
StateFlow는 현재 상태와 새로운 상태 업데이트를 수집기에 내보내는 관찰 가능한 상태 홀더 흐름입니다. value 속성을 통해서도 현재 상태 값을 읽을 수 있습니다. 상태를 업데이트하고 흐름에 전송하려면 MutableStateFlow 클래스의 value 속성에 새 값을 할당합니다.
Android에서 StateFlow는 관찰 가능한 변경 가능 상태를 유지해야 하는 클래스에 아주 적합합니다.
여기까지 읽어보면 LiveData와 비슷한데? 라는 생각이 듭니다.
livedata와 차이점
때문에 구글 문서에서는
StateFlow와 LiveData는 비슷한 점이 있습니다. 둘 다 관찰 가능한 데이터 홀더 클래스이며, 앱 아키텍처에 사용할 때 비슷한 패턴을 따릅니다.
그러나 StateFlow와 LiveData는 다음과 같이 다르게 작동합니다.
- StateFlow의 경우 초기 상태를 생성자에 전달해야 하지만 LiveData의 경우는 전달하지 않습니다.
- 뷰가 STOPPED 상태가 되면 LiveData.observe()는 소비자를 자동으로 등록 취소하는 반면, StateFlow 또는 다른 흐름에서 수집하는 경우 자동으로 수집을 중지하지 않습니다. 동일한 동작을 실행하려면 Lifecycle.repeatOnLifecycle 블록에서 흐름을 수집해야 합니다.
와 같이 설명하고 있습니다. livedata와는 다르게 view에 영향을 받고 있습니다.
shareIn
StateFlow는 핫 흐름으로, 흐름이 수집되는 동안 또는 가비지 컬렉션 루트에서 다른 참조가 있는 경우 메모리에 남아 있습니다. shareIn 연산자를 사용하여 콜드 흐름을 핫 흐름으로 전환할 수 있습니다.
sharedFlow
stateFlow / sharedFlow 들의 차이점을 잠시 보면
1. StateFlow는 반드시 초기값을 명시 해주어야 합니다.
2. StateFlow는 value 속성을 이용해 값을 방출할수 있습니다(또는 가져올수도 있죠)
3. SharedFlow는 좀더 detail한 설정값들을 생성자에 전달해줄수 있습니다.
그리고 가장 큰 차이점은 StateFlow는 값을 중복으로 방출할경우, collect()해오지 않는다는것 입니다.
- 참조
https://myungpyo.medium.com/stateflow-%EC%99%80-sharedflow-32fdb49f9a32
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
https://www.youtube.com/watch?v=6Jc6-INantQ
'Android(Kotlin)' 카테고리의 다른 글
Paging Advanced (0) | 2022.12.26 |
---|---|
Room SQLCipher (0) | 2022.12.21 |
Hot Stream / Cold Stream (0) | 2022.12.15 |
LiveData emit / emitSource (0) | 2022.12.13 |
Application Class (0) | 2022.12.06 |