Improve app performance with Kotlin coroutines | Android Developers
안드로이드 공식문서를 참고해서 작성한 포스팅 입니다.
코루틴은 장기 실행 작업을 처리하는 두 작업을 추가하여 일반 함수를 기반으로 빌드된다. invoke
(또는 call
) 및 return
이외에 suspend
와 resume
을 추가한다.
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) { /* ... */ }
위 코드의 시나리오를 살펴보자.
fetchDocs()
함수를 Dispatcher.Main에서 사용한다고 가정하자.result
변수에 get()
함수를 대입하면서 get()
함수가 끝나기 전 까지 호출된 코루틴을 일시중단한다.
get()
함수는 IO Dispatchers에서 실행되고, 네트워크 요청이 완려되면 콜백을 사용하여 다시 Main으로 돌아가 일시정지된 코루틴을 재개한다.<aside>
💡 코틀린 컴파일러는 suspend
함수를 가져와 상태머신을 사용하여 최적화된 버전의 콜백으로 변환한다. 일시중단지점(suspend
)을 상태로 나타내며 이런 상태는 컴파일러에 의해 label
로 표현되어 when
식에서 처리된다. 상태 머신에선 suspend
키워드가 붙은 함수의 내부를 처리하고 다른 일시중지 함수를 처리하거나 재개된다. 보통은 마지막 상태(마지막 label
) 때 다시 재개된다.
</aside>
Dispatchers.XX
는 코루틴 실행에 사용되는 스레드를 확인한다. → Dispatcher.XX가 코루틴을 해당 스레드에 적재한다. Dispatchers는 코루틴의 재개(resume
)를 담당한다.