# stateFlow

Flow 플로우
Flow Flow는 코루틴을 기반으로 빌드되며 비동기로 계산되는 데이터 스트림이다. 데이터베이스에서 실시간 업데이트를 수신할 수 있다. 리액티브 프로그래밍과 데이터 스트림 리액티브 프로그래밍이란 데이터가 변경될 때 이벤트를 발생시켜 데이터를 계속해서 전달하도록 하는 프로그래밍 방식이다. 리액티브 프로그래밍에는 하나의 데이터를 발행하는 생산자가 있고 그 생산자가 데이터 소비자에게 지속적으로 데이터를 전달하는데, 이 것이 데이터 스트림의 요소이다. 생산자는 스트림에 추가되는 데이터를 생산합니다. 코루틴 덕분에 흐름에서 비동기적으로 데이터가 생산될 수도 있다. (선택사항) 중개자는 스트림에 내보내는 각각의 값이나 스트림 자체를 수정할 수 있다. 소비자는 스트림의 값을 사용한

[Android] livedata 대신 stateflow를 사용해보자!
개요 요즘 coroutine flow가 핫하다고하는데 기존의 RxJava에서 코루틴으로 추세가 기운다고 들었다. Rx에 비해 러닝커브가 낮은 코루틴을 활용하여 손쉽게 옵저버 패턴을 사용해 봅시다. LiveData 대신에 StateFlow를 사용해도 괜찮을까? 대답은 Yes! 입니다. 안드로이드 에서 livedata와 stateflow는 모두 앱에서 데이터를 관리하기 위한 jetpack 라이브러리입니다. 둘은 몇가지 차이점이있지만 비슷한 목적을 가지기 때문에 상황에따라 바꿔서 사용하면 더욱 유연한 앱이 될 것입니다. LiveData vs StateFlow LiveData의경우 ui컴포넌트에 데이터를 바인딩하는경우 LiveData를 사용합니다. StateFlow는 비동기 데이터흐름을 다룰때 사용합니다. 이와같이 LiveData와 StateFlow는 상황에따라 사용하는게 좋습니다. 그래서 결국 뭘쓰면 되냐고? LiveData는 비동기 스트림

StateFlow & SharedFlow에 대한 고찰
개요 StateFlow와 SharedFlow를 구글에 검색해보면, 이에 대해 잘 정리된 문서와 블로그들이 존재하지만, 이러한 hot flow를 어떤 상황에서 적절하게 선택할 지에 대한 몇가지 아이디어에 대한 내용이 부족한 것 같아 해당 포스팅에서는 이것을 정리하며 학습하고자 한다. > 해당 포스팅에서는 collect를 수집, emit를 방출 및 발행으로 표현한다. 아래에서 보여줄 샘플 코드에서는 아래의 내용들을 보여줄 것이다. Flow를 수집하고, 뷰모델에서 StateFlow를 노출한다. stateIn extension을 사용
StateFlow vs SharedFlow
StateFlow(상태), SharedFlow(이벤트) 정리를 시작해보자. 😊 stateflow-and-sharedflow 1. StateFlow 기본 예시 collet를 했을시에는 collect를 실행했을시에는 값을 얻을 수 있습니다. 최초 초기값을 0을 가져와서 emit하기 때문에 값은 0을 얻을 수 있습니다. 만약 이와 같이 값을 계속 설정하면 이와 같은 결과를 얻게됩니다. 여기에서 '2'가 두번이 아니라 한번만 표시되는점에 유의해야합니다. StateFlow는 연속적으로 반복되는 값을 보내지않기 때문입니다. 새 collect를 추가한다고 가정해봅니다. 그렇다면 우리는 3의 값을 얻을 수 있습니다. 결론 2. SharedFlow 기본 예시 위와

StateFlow, SharedFlow, CallbackFlow 비교
본 내용은 학습을 위해 Comparing StateFlow, SharedFlow, and CallbackFlow 을 보고 입맛대로 정리한 글입니다. 개념 StateFlow collect를 시작할 때마다 항상 마지막에 emit한 값을 얻고 싶은 경우 collect를 중단하지 않음 SharedFlow -

Flow와 StateFlow의 차이
Flow의 한계 Flow는 데이터의 흐름이다. Flow는 데이터의 흐름flow을 발생시키기만 할 뿐 데이터가 저장되지 않는다. 따라서 flow만을 이용해 안드로이드의 UIState를 업데이트 하기 위해서는 두가지 방법이 가능했다. 화면이 재구성 될때마다 다시 서버 혹은 DB로부터 데이터 가져오기 Flow로부터 collect한 데이터를 ViewModel에 저장해놓고 사용하기 1번 방법은 비효율적이다. 예를 들어 안드로이드에서는 화면이 회전되었을 때마다 onDestroy가 호출된 후 다시 onCreate이 호출되는데 이때마다 새로운 데이터를 서버 혹은 DB로부터 가져와야 하기 때문이다. 2번 방법은 효율적이다. 아래 그림의 ViewModel이 살아있는 범위에서 볼 수 있듯이 ViewM
[Android] LiveData에서 StateFlow로 이전하기
개요 Android Jetpack 라이브러리 중 하나인 는 관찰 가능한 데이터 홀드 클래스로 앱의 UI 상태를 업데이트하는 데 많이 써 왔다. 하지만, 최근 코루틴의 Flow API 중 하나로 가 등장하여 를 대체하고 있다. 이 글에서는 어떻게 를 로 대체할 수 있는지 알아보도록 하겠다. LiveData의 한계와 StateFlow의 등장 LiveData는 , , 등 안드로이드 앱 컴포넌트의 생명 주기를 인식하여 메모리 누수 없이 데이터 관리를 해준다는 장점이 있다. 그러나 LiveData에는 다음과 같은 한계가 있다. 비동기 스트림을 지원하지 않는다. 는 UI와 밀접하게 연관되어 있어 오직 메인스레드(Main Thread)에서만 읽고 쓸 수 있다. 따라서 에서 를 사용하여 View를 업데이트할 때는 사용할 수 있지만, Data Layer에서 데이터를 처리할 때는 사용하기 어렵다. 데이터를 I/O 할 때에는 메인스레드(Main Thread)가

Kotlin : Flow 기초
📍 Flow 란? > 데이터 스트림이며 코루틴 상에서 반응형 프로그래밍을 지원하기 위한 구성요소이다 중간에 갱신되는 값을 받아올 수 있도록 함 builder로 생성, suspend를 사용하지 않아도 됨 프로듀서가 비동기적으로 생성, 컨슈머가 소비함 Producer : 스트림에 추가되는 데이터를 생산합니다. 코루틴 덕분에 흐름에서 비동기적으로 데이터가 생산될 수도 있습니다. flow{} 내부의 emit()를 통해 데이터 생성 Intermediary(선택사항) : 중개자는 스트림에 내보내는 각각의 값이나 스트림 자체를 수정할 수 있습니다. map을 사용해서 필터링 하여 필요한 데이터만 가져온다 Consumer : 스트림의 값을 사용합니

# Flow
LiveData vs Flow 간단 비교 LiveData 데이터를 담고 있는 데이터 홀더 클래스이다. Lifecycle을 인식하고있다. Lifecycle을 따로 관리하지 않아도 된다. 모든 구독자(신규 + 기존)는 항상 최신 데이터를 받는다 데이터를 한번만 사용하기 위해서는 기본적으로 boolean을 이용한다.(Event) Flow 코루틴 위에 구축 순차적 계산이 가능한 데이터 스트림 스트림을 수정할수 있는 중간 연산자(map,filter)를 제공한다. 수명주기를 인식하지 않는다.(원한다면 lifecycleScope를 이용하여 인식하게 만들 수 있다.) ColdFlow ( Flow ) flow의 {}내부 블록이 만들어 질 때까지 활성화 되지 않음. 수집 전과 수집 종료 후에는 비활성화 구독자는 한명만 가진다. 새로운 구독자는 새로운 실행을 생성한다.
LiveData, Event Wrapper에서 StateFlow, SharedFlow로
앱을 멀티 모듈로 변경하는 과정에서 각 특정 모듈에서 발생하는 의존도 문제를 경험하며 Android에 의존적인 LiveData의 사용을 중단하고, 이로 작성 된 코드들을 Flow 로 변경하는 작업을 진행하였습니다. 이 작업을 통해 Android에 덜 의존적인 ViewModel을 작성할 수 있었습니다. 아래 나열할 내역들은 위 작업에서 주로 사용되었던 테크닉을 정리하고, 누군가 저와 동일한 작업을 진행할 때 도움이 되었으면 좋겠습니다. SafeCollect lifeCycle 등의 이유로 Coroutine이 중단되어도, Collect는 중단되지 않고 계속해서 수집을 하는 경우가 있을 수 있습니다. 이 경우, collect는 CancellationException을 발생시킵니다. safeCollect는 매 수집마다 Coroutine의 상태를 체크하고, 중단되어 있지 않을 때만 Collect를 이어서 진행하기에, 위 Exception을 미연에 방지할 수 있습니다.