Использование сопрограмм в первый раз. Нужна помощь.
Вот мой поток:
Presenter хочет войти, поэтому вызывает интерфейс репозитория. Репозиторий реализует RepositoryInterface.
Итак, репозиторий вызывает APIInterface. APIInterface реализуется с помощью APIInterfaceImpl.
Наконец, APIInterfaceImpl вызывает MyRetrofitInterface.
Вот схема потока:
Presenter -> Repository -> APIInterfaceImpl -> MyRetrofitInterface
Как только я получу ответ на логин:
APIInterfaceImpl -> Репозиторий -> Сохраняет данные в кеше -> Предоставляет код состояния http для Presenter
Вот мой код:
RepositoryInterface.kt
fun onUserLogin(loginRequest: LoginRequest): LoginResponse
Repository.kt
class Repository : RepositoryInterface {
private var apiInterface: APIInterface? = null
override fun onUserLogin(loginRequest: LoginRequest): LoginResponse {
return apiInterface?.makeLoginCall(loginRequest)
}
}
APIInterface.kt
suspend fun makeLoginCall(loginRequest): LoginResponse?
APIInterfaceImpl.kt
override suspend fun makeLoginCall(loginRequest: LoginRequest): LoginResponse? {
if (isInternetPresent(context)) {
try {
val response = MyRetrofitInterface?.loginRequest(loginRequest)?.await()
return response
} catch (e: Exception) {
//How do i return a status code here
}
} else {
//How do i return no internet here
return Exception(Constants.NO_INTERNET)
}
}
MyRetrofitInterface.kt
@POST("login/....")
fun loginRequest(@Body loginRequest: LoginRequest): Deferred<LoginResponse>?
Мои вопросы:
- Правильно ли подходит мой подход?
- Как передать коды ошибок http или нет интернет-соединения в моем коде
- Есть более хороший подход к моему решению?