본문 바로가기
Android

코루틴

by Diane_KIM 2023. 8. 30.

비동기적으로 실행되는 코드를 간소화하기 위해 안드로이드에서 사용되는 동시성 디자인 패턴

Background Task가 필요한 대표적인 경우
1. 네트워크 Request (Retrofit, OkHttp3, UrlConnection 등)   
2. 내부 DB 접근 (Room, SQLite 등)

 

동시성 프로그래밍이 더 좋은 이유?

  • 병렬성 프로그래밍은 여러개의 스레드를 사용 → CPU가 매번 스레드를 점유했다 놓았다 반복한다. (컨텍스트 스위칭, 문맥교환)
  • 동시성 프로그래밍은 하나의 스레드 안에서 루틴들을 교환하기 때문에 자원 낭비가 비교적 덜함

 

Suspend함수

  • Suspend 함수를 멈춰두고 다른 함수를 실행한 후 다시 돌아와서 실행할 수 있게 해주는 함수
  • coroutine에서나 다른 suspend함수에서만 suspend함수 호출이 가능
    • launch함수 : 새 코루틴을 시작하고 결과값을 호출함수에게 반환하지 않음
fun main() {
   CoroutineScope(Dispatchers.IO).launch {
       testSuspendFun()
   }
}
  • async 함수 : 새 코루틴을 시작하고 await라는 정지함수로 결과를 반환할 수 있도록 허용
fun main() {
    val result = CoroutineScope(Dispatchers.IO).async {
        iWillReturnString()
    }
    print(result)
}
 
suspend fun iWillReturnString():String {
  delay(2000)
  return "result"
}

 

CoroutineScope

  • coroutine scope는 launch 혹은 async로 만들어진 coroutine을 추적한다
  • Activity 라이프사이클에 따라 동작하도록 베이스 코드를 함께 사용하는 것을 추천
  • 실행중인 코루틴을 언제든 scope.cancel()로 호출해서 취소 가능
fun main() {
   val coroutineScope = CoroutineScope(Dispatchers.IO)
   val result = coroutineScope.async {
       iWillReturnString()
   }
   print(result)
   coroutineScope.cancel()
}
  • Android에서는 특정 생명주기에 맞춰 scope를 제공한다. → viewModelScope
  • GlobalScope: object인 싱글톤으로 만들어져 있고, Application 라이프 사이클을 따라 동작해야하며, 서비스와 같은 형태에서 사용하는 것을 추천

 

Dispatchers

  • Dispatcher은 코루틴을 어떤 스레드에서 실행시킬지 결정
    • Dispatcher.Main : Android 기본 스레드에서 코루틴 실행. Ui와의 상호작용시에만 사용
    • Dispatcher.IO : 기본 스레드 외부에서 디스크 혹은 네트워크를 통한 입출력에 최적화되어 있음. 로컬 데이터 읽고 쓸때나, 네트워크 통신 할 때 사용
    • Dispatcher.Default : CPU를 많이 사용하는 작업을 기본 스레드 외부에서 실행함. 예로 Json파싱 등

 

runBlocking함수 사용은 비추

  • runBlocking()함수는 어떠한 코드 블록 내 작업이 완료되기를 기다리는 간단한 방법
  • 안드로이드에서 runBlocking()함수를 메인스레드(UI스레드)에서 호출하여 시간이 오래걸리는 작업을 수행할 경우 ANR발생할 위험이 있음
  • runBlocking()함수를 스레드를 차단 = 코드블록의 작업이 스레드를 혼자 점유
  • 우회방법
    • runBlocking()함수 대신 coroutineScope()함수나 withContext()함수를 사용해서 작업 블록을 작성

 

'Android' 카테고리의 다른 글

[깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 코틀린  (0) 2023.11.21
Flow 개념  (0) 2023.08.30
Glide  (0) 2023.08.30
Case of Fragment Memory Leak  (2) 2023.08.30
Room DB에서 Flow를 사용하여 DB 변경 observing  (0) 2023.08.30