Kotlin이 도입되면서 Thread로 비동기 처리를 한 것을 좀 더 작은 단위로써 처리할 수 있게 하는 Coroutine
여기서 설명하는 Thread에 대한 Dispatchers와 Coroutine에 디테일한 개념에 대해서는 Kotlin 공식문서와 Android 공식문서 참고, 이 부분은 기존의 방식과 다르게 현재 Retrofit 적용에 있어서 어떻게 처리했는지 위주로 볼 것임
suspend
로 선언을 함, 그리고 해당 함수를 비동기적으로 처리하고 호출하기 위해서 @POST("/auth/login")
suspend fun postSignIn(
@Body body: RequestSignIn
): Response<ResponseToken>
suspend
함수로 만듬suspend fun postSignIn(requestSignIn: RequestSignIn) = userService.postSignIn(requestSignIn)
그리고 ViewModel에서 네트워크 요청을 보낼 때 UI Thread를 차단함, 그래서 새로운 코루틴을 만들고 요청을 함 모든 코루틴은 범위 내에서 실행해야하기 때문에 아래와 같이 ViewModelScope
에서 실행을 함
이 Scope는 ViewModel
범위 내에서 실행이 됨
fun onSignIn(view: View) {
val request = RequestSignIn(email.value, password.value)
viewModelScope.launch {
val signin = userRepository.postSignIn(request)
when (signin.isSuccessful) {
true -> {
Log.e("token", "성공: " + signin.body()?.accessToken)
prefs.setAccessToken(signin.body()!!.accessToken)
prefs.setRefreshToken(signin.body()!!.refreshToken)
newsRepository.callNews()
}
else -> {
Log.e("실패", "error " + signin.message())
}
}
}
_eventSignIn.value = true
}
Dispatchers
를 추가해서 withContext
로 처리한 부분 추가 suspend fun callNews() = withContext(ioDispatcher) { newsService.callNews() }
suspend fun getNewsList() = withContext(ioDispatcher) { newsService.getNewsList() }
suspend fun getNews(newsId: Long) = withContext(ioDispatcher) { newsService.getNews(newsId) }
private val _requestSignUp: MutableLiveData<RequestSignUp?> = MutableLiveData<RequestSignUp?>()
val requestSignUp: LiveData<RequestSignUp?>
get() = _requestSignUp
fun getRequestSignUp(view: View) {
val email: String = id.value + "@" + email.value
val signUp = RequestSignUp(email, password.value, name.value)
_requestSignUp.value = signUp
}
fun getRequestSignUpComplete() {
_requestSignUp.value = null
}