안드로이드

[안드로이드] 안드로이드 coroutine 살펴보기

이손안나 2021. 7. 19. 17:33

안녕하세요~~~ 영나입니다. 오늘은 동아리에서 같이 팀원들과 프로젝트를 진행하다가 서버통신을 하던 도중에

저는 평소에 Retrofit2으로 콜백함수를 사용했었는데 팀원 중 한명이 코루틴으로 작업해보자는 말에 코루틴을 

알아보자는 의미로 가져왔습니다!!

 

코루틴_Coroutine 이란?

코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다.

 

평소 백그라운드에서 실행... 이라는 말을 많이 들어봤는데요. 이 coroutine은 안드로이드에서 백그라운드 스레드에서 코드를 처리할 때 사용하는 방법입니다. 

 

이번 블로그에서는 앱 아키텍처 가이드에 따라 네트워크 요청을 보내고 결과를 사용자에게 표시하는 주제를 다뤄보겠습니다!

 

앱 아키텍처 가이드는 다음과 같이 이루어져 있습니다.

 

 

 

  1. 종속 항목 추가

      앱의 build.gradle 파일에 다음 종속 항목을 추가해 줍니다.

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
}

ViewModel 에서는 사용자의 이벤트가 발생할 때 네트워크 요청을 트리거 합니다.

class LoginViewModel(
    private val loginRepository: LoginRepository
): ViewModel() {

    fun login(username: String, token: String) {
        val jsonBody = "{ username: \"$username\", token: \"$token\"}"
        loginRepository.makeLoginRequest(jsonBody)
    }
}

매개변수로 Repository 를 받고  네트워킹 함수를 실행합니다 . (Repository는 따로 공부 할 예정)

위의 코드에서 LoginViewModel은 네트워크 요청을 보낼 때 UI 스레드를 차단합니다. 여기서 새로운 코루틴을

만들고 I/O 스레드에서 네트워크 요청을 실행하면 된다.

 

class LoginViewModel(
    private val loginRepository: LoginRepository
): ViewModel() {

    fun login(username: String, token: String) {
        // Create a new coroutine to move the execution off the UI thread
        viewModelScope.launch(Dispatchers.IO) {
            val jsonBody = "{ username: \"$username\", token: \"$token\"}"
            loginRepository.makeLoginRequest(jsonBody)
        }
    }
}

여기서 Dispatchers.IO 는 코루틴 컨텍스트를 의미한다. main, io, default 3가지가 있다.

 

  • main 은 메인 쓰레드에 대한 컨텍스트이며 ui 갱신이나 toast 등의 view작업에 사용.
  • io 는 네트워킹이나 내부 db 접근 등 백그라운드에서 필요한 작업 수행
  • default는 크기 큰 리스트나 필터링 등 무거운 연산이 필요한 작업에 사용

Suspend 란?

suspend 는 함수 맨 앞에 붙으며 그 함수가 비동기 환경에서 사용될 수 있다는 의미를 가진다. suspend 함수는 코루틴 내에서 만 호출 할 수 있고, 아닌 곳에서 호출하면 에러가 난다.