Improve app performance with Kotlin coroutines  |  Android Developers

안드로이드 공식문서를 참고해서 작성한 포스팅 입니다.

장기 실행 작업 관리

코루틴은 장기 실행 작업을 처리하는 두 작업을 추가하여 일반 함수를 기반으로 빌드된다. invoke (또는 call) 및 return 이외에 suspendresume 을 추가한다.

suspend fun fetchDocs() {                             // Dispatchers.Main
    val result = get("<https://developer.android.com>") // Dispatchers.IO for `get`
    show(result)                                      // Dispatchers.Main
}

suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ }

위 코드의 시나리오를 살펴보자.

  1. fetchDocs() 함수를 Dispatcher.Main에서 사용한다고 가정하자.
  2. result 변수에 get() 함수를 대입하면서 get() 함수가 끝나기 전 까지 호출된 코루틴을 일시중단한다.
    1. 네트워크 요청을 시작하기 전에 코루틴을 일시정지함.
  3. get() 함수는 IO Dispatchers에서 실행되고, 네트워크 요청이 완려되면 콜백을 사용하여 다시 Main으로 돌아가 일시정지된 코루틴을 재개한다.

어떻게 이런 작업이 가능할까?

<aside> 💡 코틀린 컴파일러는 suspend 함수를 가져와 상태머신을 사용하여 최적화된 버전의 콜백으로 변환한다. 일시중단지점(suspend)을 상태로 나타내며 이런 상태는 컴파일러에 의해 label 로 표현되어 when 식에서 처리된다. 상태 머신에선 suspend 키워드가 붙은 함수의 내부를 처리하고 다른 일시중지 함수를 처리하거나 재개된다. 보통은 마지막 상태(마지막 label) 때 다시 재개된다.

</aside>

기본 안전을 위해 코루틴 사용

Dispatchers.XX 는 코루틴 실행에 사용되는 스레드를 확인한다. → Dispatcher.XX가 코루틴을 해당 스레드에 적재한다. Dispatchers는 코루틴의 재개(resume)를 담당한다.