안녕하세요~~~ 영나입니다. 오늘은 동아리에서 같이 팀원들과 프로젝트를 진행하다가 서버통신을 하던 도중에
저는 평소에 Retrofit2으로 콜백함수를 사용했었는데 팀원 중 한명이 코루틴으로 작업해보자는 말에 코루틴을
알아보자는 의미로 가져왔습니다!!
코루틴_Coroutine 이란?
코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다.
평소 백그라운드에서 실행... 이라는 말을 많이 들어봤는데요. 이 coroutine은 안드로이드에서 백그라운드 스레드에서 코드를 처리할 때 사용하는 방법입니다.
이번 블로그에서는 앱 아키텍처 가이드에 따라 네트워크 요청을 보내고 결과를 사용자에게 표시하는 주제를 다뤄보겠습니다!
앱 아키텍처 가이드는 다음과 같이 이루어져 있습니다.
- 종속 항목 추가
앱의 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 함수는 코루틴 내에서 만 호출 할 수 있고, 아닌 곳에서 호출하면 에러가 난다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Kotlin 고차함수& Lambda (0) | 2022.03.28 |
---|---|
[안드로이드] Kotlin 범위 지정 함수(let, with, run, apply, also) (0) | 2022.03.27 |
[Android] 코틀린의 enum class & Sealed class (0) | 2021.10.07 |
[Android] Kotlin 코루틴 사용 (0) | 2021.10.07 |
[안드로이드] 안드로이드 프로젝트 구조/ 초기 패키지 구조 설정하기 (0) | 2021.06.28 |