개발/Android
[실수담] flow collect 두 개 실행 시 안될 때
레란희
2022. 12. 14. 15:59
paging3 라이브러리를 적용하면서 발생한 실수 ㅜ
[문제가 된 코드]
lifecycleScope.launch {
viewModel.topicFlow.collectLatest {
topicAdapter.submitData(it)
}
viewModel.photoFlow(TopicData.TOPIC_IDX_ALL).collectLatest {
val isFirst = photoAdapter.itemCount == 0
photoAdapter.submitData(it)
if(isFirst){
checkEmpty()
}
}
}
[현상]
viewModel.photoFlow().. 부분이 동작하지 않았음.
[이유]
스택오버플로우
You will need different coroutines, since collect() is a suspending function that suspends until your Flow terminates.
아래는 단톡방에서 말씀해주신 이유들..
야옹이님 : 계속 수집하기때문에 Blocking되서 아래것이 실행안되는게 아닐까요
이상해씨님 : collect가 suspend function이라서 코루틴 빌더 안에 있어야해요. collect가 suspend function인데 flow가 끝이 없다면 suspend가 끝나지 않겠죠
Rokace님 : Stateflow는 lifecyclescope에 기반하여 데이터의변화를 관측하는 무한루프 쓰레드 하나를 만듭니다.
Stateflow 하나당 쓰레드 하나죠
그래서 collect는 destroy이전까지 동작합니다.
[개선한 코드]
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
viewModel.topicFlow.collectLatest {
topicAdapter.submitData(it)
}
}
launch {
viewModel.photoFlow(TopicData.TOPIC_IDX_ALL).collectLatest {
val isFirst = photoAdapter.itemCount == 0
photoAdapter.submitData(it)
if(isFirst){
checkEmpty()
}
}
}
}
}
별도의 코루틴으로 launch 해 주었다.