Android의 코루틴

Jan 29 2023
코루틴이란 무엇입니까? 코루틴은 기본 스레드를 차단하고 앱이 응답하지 않게 만들 수 있는 장기 실행 작업을 관리하는 데 도움이 됩니다. 코루틴은 비동기적으로 실행되는 코드를 단순화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴입니다.

코루틴이란 무엇입니까?

코루틴은 기본 스레드를 차단하고 앱이 응답하지 않게 만들 수 있는 장기 실행 작업을 관리하는 데 도움이 됩니다. 코루틴은 비동기적으로 실행되는 코드를 단순화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴입니다.

위의 다이어그램에서 볼 수 있듯이 메인 스레드에서는 작은 작업만 수행할 수 있습니다. 메인 스레드에서 장기 실행 작업을 수행하려는 경우 앱이 충돌하고 느려질 수 있습니다. 또는 아니오를 생성하는 경우. 백그라운드/작업자 스레드의 경우 메모리 부족 문제가 발생합니다. 코루틴은 의도적으로 호출자에게 제어 권한을 양보하지만 프로세스에서 해당 컨텍스트를 종료하지 않고 대신 유휴 상태로 유지하는 특수한 유형의 함수입니다.

코 루틴을 사용하는 방법?

dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:x.x.x"
}

  • Main: UI 스레드를 사용합니다. In Rx는 AndroidSchedulers.MainThread()와 유사합니다.
  • 기본값: CPU를 많이 사용하는 작업 에 사용됩니다 . 사용 가능한 CPU 코어 수만큼 스레드를 사용하게 됩니다. CPU를 많이 사용하는 작업이기 때문에 CPU가 바쁠 것이기 때문에 많은 스레드를 실행하는 것은 의미가 없습니다. Rx의 Schedulers.computation()과 유사합니다.
  • IO: 입력/출력 에 사용됩니다 . API 요청, DB 접근 등 Rx의 Schedulers.io()와 유사합니다.
  • 작업: 기본적으로 백그라운드에서 실행되는 작업이며 완료되면 수명 주기가 소멸되는 작업으로 해석될 수 있습니다.
  • 작업을 사용하여 다른 작업 실행: Job.join
  • 모든 하위 작업 취소: Job.cancel
  • withContext: await()를 작성할 필요가 없는 비동기를 작성하는 또 다른 방법입니다.
  • suspend fun fetchUser() = withContext(Dispatchers.IO) {
            // make network call
            // return 
    }
    

Suspend : 이름에서 알 수 있듯이 특정 시점에서 코루틴의 실행을 일시 중지했다가 결과가 준비되면 다시 함수 실행을 재개하는 함수입니다.

suspend fun makeNetworkRequest() {
    // fetchData is another suspend function, so 'makeNetworkRequest' is going to be `suspended`
    // until it's result becomes available, without blocking the main thread.
    val result = fetchData()
    // continues executing once the result becomes available
    show(result)
}

// fetchData is main thread safe
suspend fun fetchData(): Result { ... }

시작은 메인 스레드를 차단하지 않지만, 나머지 코드 부분의 실행은 시작이 일시 중단 호출이 아니기 때문에 시작 결과를 기다리지 않습니다.

fun GFG()
{
    var resultOne = "Android"
    var resultTwo = "Kotlin"
    Log.i("Launch", "Before")
    launch(Dispatchers.IO) { resultOne = function1() }
    launch(Dispatchers.IO) { resultTwo = function2() }
    Log.i("Launch", "After")
    val resultText = resultOne + resultTwo
    Log.i("Launch", resultText)
}

suspend fun function1(): String
{
    delay(1000L)
    val message = "function1"
    Log.i("Launch", message)
    return message
}

suspend fun function2(): String
{
    delay(100L)
    val message = "function2"
    Log.i("Launch", message)
    return message
}

Async는 코루틴을 시작하는 데에도 사용되지만 프로그램의 await() 함수 진입점에서 메인 스레드를 차단합니다 .

fun GFG
{
    Log.i("Async", "Before")
    val resultOne = Async(Dispatchers.IO) { function1() }
    val resultTwo = Async(Dispatchers.IO) { function2() }
    Log.i("Async", "After")
    val resultText = resultOne.await() + resultTwo.await()
    Log.i("Async", resultText)
}

suspend fun function1(): String
{
    delay(1000L)
    val message = "function1"
    Log.i("Async", message)
    return message
}

suspend fun function2(): String
{
    delay(100L)
    val message = "function2"
    Log.i("Async", message)
    return message
}

코루틴 사용의 이점

  • 코루틴은 가벼운 스레드입니다.
  • 코루틴은 병렬로 실행되고 서로 대기하며 서로 통신할 수 있습니다.
  • 메모리 문제 없이 수천 개의 코루틴 생성
  • 최신 애플리케이션에 가장 적합