Dispatchers란?
Coroutine이 실행될 스레드를 지정하는 것
아래 예시에서 Dispatchers 옵션이 다른 걸로 들어간다면??
fun setHelloWorld() {
viewModelScope.launch {
try {
val helloWorld = withContext(Dispatchers.IO) {
getHelloWorldUseCase.invoke()
}
_helloWorldUiState.value = helloWorld.title
} catch (e: Exception) {
_helloWorldUiState.value = "API 통신 실패"
}
}
}
Dispatchers.IO
- I/O 작업에 최적화
- 예: 이미지 다운로드, 파일 입출력, 네트워킹, DB 작업
- getHelloWorldUseCase가 네트워크 요청을 수행하면,
- 이를 최적화된 스레드에서 실행함
- UI 스레드가 차단되지 않고 네트워크 요청이 빠르게 처리됨
Dispatchers.Default
- CPU를 많이 쓰는 작업에 최적화
- getHelloWorldUseCase가 네트워크 요청을 수행하면,
- CPU 집약적 작업을 위해 설계되었기 때문에 비효율적일 수 있음
Dispatchers.Main
- UI 작업에 적합
- 안드로이드 Main 스레드를 사용
- getHelloWorldUseCase가 네트워크 요청을 수행하면,
- 네트워크 요청이 UI 스레드에서 실행되어 UI가 차단될 수 있음
- 네트워크 요청이나 긴 작업을 메인 스레드에서 실행하는 것은 피해야 함.
Dispatchers.Unconfined
- 호출한 context를 기본으로 사용하는데, 중단 후 다시 실행될 때 context가 바뀌면 바뀐 context를 따라가는 Dispatcher
- 특정 스레드에 바인딩되지 않으며, 일반적인 사용에는 권장하지 않음
- 주로 테스트용으로 사용되며, 일반적인 네트워크 요청이나 UI 업데이트에는 권장되지 않음
- getHelloWorldUseCase가 네트워크 요청을 수행하면,