ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코루틴] 코틀린(Kotlin)의 코루틴(Coroutine)
    Android 2021. 8. 27. 22:07
    728x90

    안드로이드에서 비동기 처리하는데는 몇가지 방법이 있다.

    • Rx는 다양한 기능을 제공하지만 진입 장벽이 높다. AsyncTask 는 Deprecated 되었고 복잡하다.
    • 코루틴은 비동기스럽지 않게 생긴 코드로, 메모리를 효율적으로 사용하면서 손쉽게 비동기 처리를 할 수 있다.
    • 코루틴은 스레드 위에서 실행되는데, 코루틴 1을 실행하던 중 2가 실행되어도 실행중인 스레드를 정지하면서 컨텍스트 스위칭 개념으로 다른 스레드로 전환하는 것이 아니라, 기존 스레드를 유지하며 기존 스레드에서 코루틴 2를 실행하게 된다.

     

    주요 키워드

    suspend

    • 코루틴 안에서 suspend 함수가 호출될 경우 이전까지의 코드 실행이 멈추며 suspend 함수가 처리 완료된 후, 멈춰있던 원래 스코프의 다음 코드가 실행된다.
    • 코루틴을 정지하면 현재 스택 프레임이 복사되고 저장된다. 재개되면 스택 프레임이 저장된 위치에서 다시 복사되고 함수가 다시 실행된다.
    • suspend 함수가 실행되면서 호출한 쪽의 코드는 잠시 멈추지만 스레드를 차단하지 않는다.

     

    Dispatcher

    코루틴 실행에 사용되는 스레드를 확인한다.

    • Dispatchers.Default : 안드로이드 기본 스레드풀 사용. CPU 사용량이 많은 작업에 사용
    • Dispatchers.IO : 네트워크, 디스크 사용 할때 사용. (네트워크, 디스크, DB 작업)
    • Dispatchers.Main : 안드로이드의 경우 UI 스레드를 사용합니다.

     

    withContext

    • 콜백을 도입하지 않고도 코드 줄의 스레드 풀을 제어할 수 있다.
    • withContext 는 콜백 기반 구현에 비해 오버헤드가 적다. 네트워크 라이브러리에서 withContext()를 여러 번 사용하더라도 동일한 디스패처에 유지되고 스레드가 전환되지 않는다. (반드시 동일한 스레드라는 보장은 없음)

     

    코루틴 시작 - launch & async

     

    1. 사용할 Dispatcher 를 결정하고
    2. Dispatcher 를 이용해서 CoroutineScope 만들고
    3. CoroutineScope 의 launch 또는 async 에 수행할 코드 블록을 넘기면 됩니다.

    launch 와 async 는 CoroutineScope 의 확장함수 이며, 넘겨 받은 코드 블록으로 코루틴을 만들고 실행해주는 코루틴 빌더

    • launch : Job 객체를 반환하며, 새 코루틴을 시작하고 호출자에게 결과를 반환하지 않음
    • async : Deferred 객체를 반환 하며, 새 코루틴을 시작하고 await 정지함수로 결과를 반환하거나, 작업이 끝나기를 대기하거나, 취소하는 등의 제어가 가능

     

    CoroutineScope

    코루틴의 범위, 코루틴 블록을 묶음으로 제어할수 있는 단위

    launch 또는 async 를 사용하여 만든 코루틴을 추적하며, 실행중인 코루틴은 언제든지 scope.cancel() 로 취소 가능

    • GlobalScope : 앱의 생명주기와 함께 동작하므로 시작 ~ 종료까지 긴 기간 실행되는 코루틴의 경우 적합.
    • CoroutineScope : Dispathcer 를 지정하여 코루틴이 실행될 스레드를 지정할 수 있음.
    • ViewModelScope

     

    CoroutineContext

    다음 요소들로 코루틴의 동작을 정의

    새 CoroutineContext 를 launch 또는 async 함수에 전달하여 상속된 요소를 재정의할 수 있음.

    • Job : 코루틴의 수명 주기를 제어
    • CoroutineDispatcher : 적절한 스레드에 작업을 전달
    • CoroutineName : 디버깅에 유용한 코루틴의 이름
    • CoroutineExceptionHandler : 포착되지 않은 예외 처리

     

     

    참고

    728x90

    'Android' 카테고리의 다른 글

    [Android] MVC vs MVP vs MVVM  (0) 2021.08.29
    [Android] Android HTTP 통신 (Retrofit, HttpUrlConnection)  (0) 2021.08.28
    [Android] RxJava  (0) 2021.08.28
    [코루틴] 코루틴(Coroutine) 이란  (0) 2021.08.22
    Android Developer Roadmaps 2020  (0) 2020.12.05
Designed by Tistory.