일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- DiffUtilCallback
- Clean Architecture
- 키보드 숨기기
- Android
- 앱개발
- 뷰모델팩토리
- notifyDataSetChanged 대신 사용하기
- 안드로이드
- 계층 분리
- error
- 안드로이드 DB
- 어댑터 효율적으로 사용하기
- android aac
- 코틀린
- HotStream
- 화면전환
- list adapter
- koltin
- hilt
- 클린아키텍처
- DI
- SQLite
- compose
- 안드로이드 스튜디오 구버전 다운받기
- notifyDataSetChanged 비효율
- 다른버전 다운로드
- Kotlin
- 의존성주입
- ColdStream
- fragment
- Today
- Total
DoReMi
[Kotlin] Flow(StateFlow,SharedFlow) 본문
State Flow 왜 써야할까?
State Flow란?
StateFlow 는 현재 상태와 새로운 상태 업데이트를 collector에 내보내는 Observable한 State holder flow 입니다.
StateFlow는 SharedFlow의 한 종류이며, LiveData에 가장 가깝습니다.
항상 값을 가지고 있고 오직 한 가지 값만 가집니다. 그러므로 초기값이 존재해야합니다.
여러 개의 collector를 지원합니다. 즉 flow를 공유할 수 있습니다.
collector 수에 상관없이 항상 구독하는 것의 최신 값을 받습니다.
Hot Stream 방식으로 collect할 때마다 flow가 재실행되지 않습니다.
LiveData의 문제점
LiveData를 대신해서 StateFlow를 사용하게 되는 것인데..
왜 LiveData 대신 StateFlow를 사용하는 것 일까?
클린 아키텍쳐 관점으로 봐야한다.
- LiveData 는 UI 에 밀접하게 연관되어 있기 때문에 Data Layer 에서 비동기 방식으로 데이터를 처리하기에 자연스러운 방법이 없다.
- LiveData 는 안드로이드 플랫폼에 속해 있기 때문에 순수 Java / Kotlin 을 사용해야 하는 Domain Layer 에서 사용하기에 적합하지 않다.
State Flow를 사용해서 얻는 이점
- 안드로이드 플랫폼에 종속적이었던 LiveData 와는 달리, StateFlow 는 순수 kotlin 라이브러리이기 때문에 Domain Layer 에서 사용할 수 있습니다.
- 코루틴을 통해 Work Thread 에서도 비용이 많이 드는 데이터 스트림을 처리할 수 있기 때문에 Data Layer 에서 LiveData 를 사용하는 것보다 향상된 성능으로 사용 가능합니다.
- StateFlow 는 zip, flatMapMerge 등 다양한 Flow API 를 사용할 수 있기 때문에 LiveData 보다 풍부하게 활용할 수 있습니다.
SharedFlow란?
StateFlow의 일반화된 버전으로 볼 수 있으며, SharedFlow 또한 Flow 와 달리 Hot Stream 이다.
초기값을 가지지 않고, 여러 설정이 가능하기 때문에 주로 이벤트 처리에 사용할 수 있다.
값을 가지지 않으며, 초기값을 갖고있지 않아도 됩니다.
replayCache가 존재하는데, replay란 collect시 전달받을 이전 데이터의 개수이고 몇 개까지 값을 캐싱하고 있을지에 대해서는 인자로 정의할 수 있습니다.
Hot Stream 방식입니다.
파라미터로 relplay, extraBufferCapacity, onBufferOverflow를 받을 수 있습니다.
버퍼 관련 설정
extraBufferCapacity로 버퍼 개수 설정이 가능하다.
버퍼를 설정하는 이유는flow의 emit 이 빠르고 collect가 느리면 지정된 개수만큼 버퍼에 저장하는 식으로 실행하는데 이 개수를 넘어가면onBufferOverflow 으로 설정한 버퍼 정책에 따라 동작하게 된다.
- BufferOverflow.SUSPEND
buffer가 꽉 찼을 때 emit을 수행하면 emit 코드가 blocking 된다. 즉, buffer의 빈자리가 생겨야 emit 코드 이후의 코드가 수행될 수 있다.
- BufferOverflow.DROP_OLDEST
buffer가 꽉 찼을 때 emit을 수행하면 오래된 데이터 부터 삭제하면서 새로운 데이터를 넣는다.
- BufferOverflow.DROP_LATEST
buffer가 꽉찼을때 emit을 수행하면 최근 데이터를 삭제하고 새로운 데이터를 넣는다.
Cold Stream vs Hot Stream
Cold Stream
- 하나의 소비자(Consumer)에게 값을 보낸다
- 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행한다
- 예) 상태가 변하지 않는 값을 읽을 때(DB를 읽거나 URL을 통해 서버 값을 읽는 경우)
- Flow
Hot Stream
- 하나 이상의 소비자(Consumer)에게 값을 보낸다
- 데이터 발행이 시작된 이후 부터 모든 소비자에게 같은 데이터를 발행하고 구독자가 없는 경우에도 데이터를 발행한다
- 예) 상태가 변하는 값을 읽을 때(라디오에서 방출하는 방송을 청취할 때)
- State Flow, SharedFlow
Flow와 Channel, Cold Stream과 Hot Stream
Flow와 Channel, Cold Stream과 Hot Stream
Cold Stream VS Hot Stream
medium.com
'Android > 개념' 카테고리의 다른 글
[kotlin] ViewModelFactory (0) | 2024.01.26 |
---|---|
[Kotlin] ListAdatper / DiffUtil (0) | 2024.01.19 |
[Kotlin] Coil 라이브러리 (0) | 2023.11.19 |
[Kotlin] 파이어베이스 사용 코드 예시 (0) | 2023.09.14 |
[Kotlin] 키보드 이벤트 (0) | 2023.08.15 |