[Android] Coroutine Dispatchers

jmi·2024년 11월 12일
post-thumbnail

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가 네트워크 요청을 수행하면,
    • 어떤 스레드에서 실행될지 예측하기 어려워짐
profile
안드로이드 개발자가 되자

0개의 댓글