Retrofit2 + Coroutine에 대한 기록
비동기처리를 할 때 주로 Rxjava2를 사용하지만, 코틀린에서는 Coroutine 이라는 것을 이용할 수 있다.
특히 서버통신에서 Rxjava대신 Coroutine을 사용하면 낮은 학습곡선 및 보일러 플레이트 코드를 상당히 줄일 수 있다는 장점이 있다.
@GET("search/repositories")
suspend fun searchRepo(@Query("q") query: String): RepoSearchResponse
기존의 retrofit2만을 사용하던 때와 달리 suspend 수식어를 사용하고, Call<T> 대신 data class type으로 리턴한다.
viewModelScope.launch {
val searchRepoInfo = service.searchRepo(query)
searchArray.value = searchRepoInfo.items
totalCount.value = searchRepoInfo.total_count
}
api 호출은 viewModelScope를 이용하여 호출한다. 실제로는 비동기 처리 코드지만 마치 동기 코드처럼 짤 수 있다.
service.searchRepo(query).enqueue(object : Callback<RepoSearchResponse?> {
override fun onResponse(
call: Call<RepoSearchResponse?>,
response: Response<RepoSearchResponse?>
) {
if (response.isSuccessful) {
val result = response.body()!!
searchArray.value = result.items
totalCount.value = result.total_count
} else { //통신에러
}
}
override fun onFailure(call: Call<RepoSearchResponse?>?, t: Throwable) {
//통신에러
}
})
기존에는 이런식으로 콜백을 받는 형태의 코드를 작성해야했다.
위 기능은 retrofit2 2.6.0 이상의 버전에서만 동작한다.
+) Coroutine에 대한 추가기록
코루틴 없이 retorfit2을 사용할 때 responsedata가 필요없으면 Call<Void> 의 형태로 사용했지만,
코루틴을 사용할 땐 Response<Unit> 의 형태로 사용해야한다.
'Android > Architecture' 카테고리의 다른 글
Android - TDD 셋업하기 (Unit Test) (0) | 2021.10.13 |
---|---|
안드로이드 MVVM 패턴 익히기 (4) Dagger-Hilt (0) | 2021.01.07 |
안드로이드 MVVM 패턴 익히기 (3) Repository + DI (0) | 2021.01.02 |
안드로이드 MVVM 패턴 익히기 (2) LiveData+ViewModel (0) | 2020.12.27 |
안드로이드 MVVM 패턴 익히기 (1) DataBinding (0) | 2020.12.22 |