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

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































