Я впервые использую сопрограмму. Я следую шаблону MVP для простого приложения входа в систему. Вот мой поток кода -
Нажатая кнопка входа будет следовать этому направлению -
LoginFragment -> LoginPresenter -> Репозиторий -> APIRepository -> RetrofitInterface
Ответ при входе будет следовать в этом направлении -
RetrofitInterface -> APIRepository -> Репозиторий -> LoginPresenter -> LoginFragment
Вот код -
RetrofitInterface.kt
@POST("login")
fun loginAPI(@Body loginRequest: LoginRequest): Deferred<LoginResponse>?
Вот мой Результат.kt
sealed class Result<out T : Any> {
class Success<out T : Any>(val data: T) : Result<T>()
class Error(val exception: Throwable, val message: String = exception.localizedMessage) : Result<Nothing>()
}
APIRepository.kt
override suspend fun loginAPICall(loginRequest: LoginRequest) : Result<LoginResponse>? {
try {
val loginResponse = apiInterface?.loginAPI(loginRequest)?.await()
return Result.Success<LoginResponse>(loginResponse!!)
} catch (e : HttpException) {
return Result.Error(e)
} catch (e : Throwable) {
return Result.Error(e)
}
}
Repository.kt
override suspend fun loginUser(loginRequest: LoginRequest): Result<LoginResponse> {
if (isInternetPresent(context)) {
val result = apiRepositoryInterface?.loginAPICall(loginRequest)
if (result is Result.Success<LoginResponse>) {
val loginData = result.data
cache?.storeData(loginData)
}
return result!!
} else {
return Result.Error(Exception())
}
}
Как мне запустить сопрограмму сейчас в моем докладчике? Мне нужно выполнить этот вызов API в фоновом потоке и опубликовать результаты в потоке пользовательского интерфейса?