오늘도 더 나은 코드를 작성하였습니까?

Stateflow LiveData 본문

Coroutine/coroutineFlow

Stateflow LiveData

hik14 2021. 6. 2. 12:07

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 (앱이 백그라운드로 이동하면 자동 구독 / 구독 취소)의 모든 이점을 얻을 수 있으므로 가치가 있습니다.