AdView처럼 라이브러리에 로딩을 시키고,
해당 로딩이 다 될 때까지 기다릴 때 어떻게 구현해야 하는지 정리해 보겠습니다.
1. Mode 설정
먼저 여러가지 모드를 설정하기 위해서 다음과 같이 Mode에 관한 sealed class를 하나 작성해 줍니다.
이것은 로딩에서 로드가 완료되었을 때를 알기 위해서 인데요.
광고라이브러리에서는 보통 콜백으로 로드가 다 되었을 때 호출되는 onAdLoaded 와 같은 함수를 제공해 주므로,
이러한 콜백함수에서 Mode를 Loaded로 해주고,
로딩을 시작할 때, Loading으로 모드를 설정해 주면 되겠지요.
sealed class AdMode {
object Loading : AdMode()
object Loaded : AdMode()
data class Error(val message: String) : AdMode()
}
이제 MutableStateFlow를 이용할 차례입니다.
참고로 StateFlow에 대해서는 아래 글을 참조해 주세요.
>> StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn
val adMode = MutableStateFlow<AdMode>(AdMode.Loading)
2. 기다리기 구현
Coroutine의 suspend 함수를 사용하면 되는데요.
먼저 viewModel에 다음과 같은 함수를 만들어 줍니다.
first의 predicate 즉, 조건을 만족하는 것이 나올 때까지 기다리도록 하는 것이 핵심입니다.
suspend fun waitForAdLoading() {
adMode.first { it !is AdMode.Loading }
}
3. Coroutine에서 실행하기
이제 위에서 만든 StateFlow와 suspend 함수를 이용해서 Coroutine에서 실행해주기만 하면 되는데요.
아래와 같이 Coroutine에서 waitForAdLoading()을 실행시킨 후,
결과 값이 나오게 되면,
AdMode.value에 따라서 코드를 구현해 주기만 하면 됩니다.
lifecycleScope.launch {
quizViewModel.waitForAdLoading()
when (val mode = quizViewModel.AdMode.value) {
is AdMode.Loaded -> {
//로딩완료시 구현할 코드
}
is AdMode.Error -> {
//에러시 구현할 코드
}
else -> { }
}
}
이상으로 MutableStateFlow를 이용해서 로딩 후 로딩완료를 기다리는 방법에 대해서 정리해 보았습니다.
'Android 개발 > Coroutine , Flow, Channel' 카테고리의 다른 글
Flow 결합연산자 combine , zip , merge 비교 총정리 # Kotlin Coroutine (0) | 2023.05.03 |
---|---|
onEach vs onStart 비교 정리 # Kotlin Coroutine Flow (0) | 2023.05.03 |
Coroutine suspend 동작에 관한 좋은 예와 잘못된 예 # 비동기 (0) | 2023.04.18 |
flatMapLatest 이용해서 값이 들어오는 것을 기다리기 # Coroutine (0) | 2023.04.18 |
함수 실행 시간 측정 후 Delay 사용하기 (0) | 2023.04.14 |
StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn (0) | 2022.10.12 |
Kotlin Coroutine Flow 총정리 part3 # launchIn (0) | 2022.10.10 |
Kotlin Coroutine 총정리 part2 # Cancellation Exception Handling (0) | 2022.10.09 |
Kotlin Coroutine 총정리 part1 # launch async Context Job CoroutineScope (2) | 2022.10.07 |
Coroutine을 이용해 Parallel한 네트워크 호출 #Kotlin (0) | 2020.03.28 |
댓글