SharingStarted.WhileSubscribed(5_000) -> 5000ms 로 설정하는 이유

이지훈·2022년 11월 28일
0

[Android]

목록 보기
6/8
post-custom-banner

Flow(cold flow)를 StateFlow(hot flow)로 변환하기 위한 함수인 stateIn 에는 3가지 파라미터가 존재하는데 그 중에 started 에 들어갈 수 있는 값들을 알아보도록 하겠다.

started: Flow로 부터 언제부터 구독을 할지 명시 할 수 있다.

SharingStarted.Eagerly -> 시작하자마자 실행된다는 의미로, 뷰모델이 생성될때 실행된다(init{} 과 같은 역할).

SharingStarted.Lazily -> 누군가가 구독(collect)하는 순간부터 실행하며, 중단 되지 않는다, 따라서 아무도 이벤트를 구독하지 않게되어도 계속 실행된다.

SharingStarted.WhileSubscribed() -> 마찬가지로 누군가가 구독(collect)하는 순간부터 실행하며, WhileSubscribed(ms:5_000), 아무도 구독하지 않게 된 경우, 5초 동안(Timeout) 기다린 후에 이벤트(StateFlow 발행)를 중단한다.

해당 stateFlow를 여러곳에서 참조하는 경우 의미를 가지며, 그런 케이스가 아닌 경우 굳이 Timeout을 걸어주지 않는 것이 좋다. 해당 StateFlow가 여러 곳에서 공유할 가능성이 생길 경우, 오류를 막기 위해서 관용적으로 5초 정도 Timeout을 설정한다.

공유가 되지 않아야된다는 옵션이 있을 경우, Default값(0)으로 해주는 것이 좋다.

Manuel Vivo - Things to know about Flows shareIn and stateIn operators

또한 5초로 설정하는 경우,마지막 구독자가 사라진지 5초 후에 upstream flow가 활성 상태에 있게되는 것을 막는데, 이는 upstream flow 가 configuration change와 같은 특정 상황에서 재시작하는 것을 피할 수 있다고 언급하고 잇다.

나는 이부분에서 viewModel은 어차피 configuration change가 발생해도 살아남기 때문에 굳이 5초와 같은 Timeout 옵션을 설정해줄필요가 있나? 의문이 들었는데 이 부분에 관해 다른 분께서도 질문을 남겨주셨다.

Why is SharingStarted.WhileSubscribed(5000) still needed in ViewModel?

답변은 다음과 같았다.


해당 글의 언급 부분은 config change 에 대한 것이 아니며 Activity가 background로 진입하였는데 (파괴되지 않은채로) Flow가 여전히 활성 상태일때에 관한 것이며
마지막 collector가 구독(collect)을 중단하고 나서 Flow가 중지되는데 5초의 Timeout을 설정한다는 내용이라고 한다.

참고)
The RED: 강사룡의 앱 안정성 및 확장성 강화를 위한 Android 아키텍처

https://kotlinworld.com/233

https://medium.com/androiddevelopers/things-to-know-about-flows-sharein-and-statein-operators-20e6ccb2bc74

https://github.com/chrisbanes/tivi/discussions/896

https://jisungbin.medium.com/%EC%BD%94%ED%8B%80%EB%A6%B0-flow-%EB%BF%8C%EC%8B%9C%EA%B8%B0-36fbb53300b9

profile
실력은 고통의 총합이다. Android Developer
post-custom-banner

0개의 댓글