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 해 주었다.
'개발 > Android' 카테고리의 다른 글
baseContext, applicationContext, 그리고 this@MainActivity (0) | 2023.04.23 |
---|---|
Gradle 8.0.0으로 변경 후 겪었던 문제 (0) | 2023.04.22 |
[DI] hilt 조금만 찍먹해보았다 (0) | 2022.12.07 |
[예제] RecyclerView, 거기에 AAC ViewModel와 LiveData, ListAdapter를 곁들인... (0) | 2022.12.06 |
페이징3 - 기본 기능 구현 + LoadStateAdapter + Refresh + EmptyView 구현 (0) | 2022.12.02 |