(Android/안드로이드) Coroutine으로 1초 지연 실행하기

✨ 개요


1. 요약


2. Coroutine delay 기본 사용법

GlobalScope.launch {
    delay(1000)
    println("1초 뒤 실행됨")
}

하지만 GlobalScope는 절대 사용하면 안 된다. (수명 관리가 되지 않아 메모리 누수 위험)


3. Activity/Fragment에서 delay 실행 (lifecycleScope)

UI에서 delay를 실행하려면 lifecycleScope를 사용한다.

lifecycleScope.launch {
    delay(1000)
    // 1초 뒤 실행
    binding.textView.text = "1초 뒤 업데이트!"
}

4. ViewModel에서 delay 실행 (viewModelScope)

ViewModel에서는 viewModelScope로 실행한다.

viewModelScope.launch {
    delay(1000)
    _uiState.value = _uiState.value.copy(showMessage = true)
}

5. Dispatchers 지정 (Main / IO / Default)

Coroutine delay는 어떤 Dispatcher에서도 사용할 수 있다.

5-1. Main에서 delay 후 UI 갱신

lifecycleScope.launch(Dispatchers.Main) {
    delay(1000)
    updateUI()
}

5-2. 백그라운드(IO)에서 delay 후 작업 수행

lifecycleScope.launch(Dispatchers.IO) {
    delay(1000)
    doBackgroundTask()
}

6. try/catch로 delay 취소 처리하기

lifecycleScope.launch {
    try {
        delay(1000)
        println("실행됨")
    } catch (e: CancellationException) {
        println("코루틴 취소됨")
    }
}

7. delay VS Thread.sleep 차이

구분 delay Thread.sleep
스레드 블로킹 여부 ❌ 블로킹하지 않음 ⭕ 해당 스레드를 블로킹
사용 위치 Coroutine 내에서 사용 어디서나 가능
권장 여부 ⭐⭐⭐⭐⭐ 매우 권장 ❌ 안드로이드에서 거의 사용 금지
lifecycle 안전성 있음 없음

8. binding.progressBar.isVisible = true

lifecycleScope.launch {
    delay(1000)
    binding.progressBar.isVisible = false
}

9. View.postDelayed() vs Coroutine delay

항목 Coroutine delay View.postDelayed
실행 위치 CoroutineScope 내부 View가 attach된 상태
스레드 블로킹 ❌ 없음 ❌ 없음
lifecycle 자동 취소 Activity/Fragment/ViewModelScope 사용 시 가능 View가 detach되면 자동 취소
코드 간결성 ⭐⭐ ⭐⭐⭐⭐⭐
취소 편의성 매우 좋음 removeCallbacks 필요
UI 관련 작업 매우 적합 View 기반 작업에 최적
백그라운드 작업 매우 적합 부적합


Related Posts