Stateflow LiveData
stateflow
- Observable하며 state를 지니고 있다.
- StateFlow는 최신 및 새로운 state가 생성된 경우에만 반환하고 동일한 state는 반환하지 않는다.
- flow는 일반적으로 cold stream(터미널 연산자가 실행시 생산자를 실행시킴), StateFlow는 hot stream입니다.
즉 일반 Flow는 최신의 state를 보유 할 수 없으며 터미널 연산자가 실행시 활성화 되는 반면 StateFlow는 최신의 state를 보유 할 수 있으며 생성하자마자 상태를 보유하며, 그렇기 때문에 반드시 초기값이 필요로한다.
StateFlow는 ConflatedBoradcastChannel을 대체하기 위해 설계되었습니다. StateFlow는 기본 콘셉트로 distinctUntilChanged 연산자의 기능을 가지고 있기 때문에, 업데이트될 때 같은 값이라면 필터 됩니다.
sharedflow
- ShraredFlow는 매우 잘 구성된 StateFlow의 일반화 버젼의 flow이다.
- StateFlow는 기본정책은 새 구독자가 있을 때 마지막으로 알려진 값을 내 보냅니다.
- SharedFlow를 사용하면 내보 낼 이전 값 수를 정할 수 있습니다.
- 값의 버퍼가 가득 차면 어떤 일이 발생하는지 정의할 수 있습니다. (백프레셔 발생시 - 생산된 값을 소비자가 빠르게 소비하지 못할때)
Stateflow VS LiveData
- StateFlow의 경우 초기 값이 반드시 필요하지만, LiveData의 경우는 필요하지 않습니다.
- View(Activity,Fragment)가 STOPPED 상태(백그라운드로 진입)가 되면 LiveData.observe()는 소비자를 자동으로 등록 취소하는 반면, StateFlow 또는 다른 flow에서 수집의 경우 자동으로 중지하지 않습니다.
class MyActivity : AppCompatActivity() {
private val viewModel = getViewModel()
override fun onCreate(savedInstanceState: Bundle?) {
lifecycleScope.launchWhenStarted {
viewModel.userName.collect { userName -> userNameLabel.text = userName }
}
}
}
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
viewModel.userName.asLiveData().observe(viewLifecycleOwner) { userName -> userNameLabel.text = userName }
}
}
- LiveData는 Android Lifecycle에 따라 달라지기 때문에 Views / ViewModels 외부에서 사용하기에 적합하지 않습니다.
- StateFlow는 LiveData와 같은 동작을 하지만, 더 많은 연산자(combind, zip, ect)와 더 좋은 성능을 가지고 있습니다.
- StateFlow API는 LiveData와 거의 동일하며 SharedFlow는 고급 사용 사례를 위한 유연성을 제공합니다.
- StateFlow는 LiveData (앱이 백그라운드로 이동하면 자동 구독 / 구독 취소)의 모든 이점을 얻을 수 있으므로 가치가 있습니다.