Думайте о сопрограммах, как о обычном синхронном коде.Как бы вы написали это, если бы фоновая работа была завершена немедленно?Может быть, что-то вроде этого:
override fun signInWithCoroutinesTest(email: String, password: String) {
view?.showProgress()
if(!signInInteractor.signIn(email,password)) view?.showSignInError()
view?.hideProgress()
}
Или, если вы хотите отловить ошибку, что-то вроде этого
override fun signInWithCoroutinesTest(email: String, password: String) {
view?.showProgress()
try {
signInInteractor.signIn(email,password))
} catch(e: AuthenticationException) {
view?.showError(e.message)
}
view?.hideProgress()
}
С сопрограммами вы просто пишете точно такой же код, но сами методы приостанавливаютсяа не блокировать темы.Таким образом, в этом случае signIn
будет функцией приостановки, и ее нужно будет вызывать из сопрограммы или другой функции приостановки.Исходя из этого, вы, вероятно, захотите, чтобы внешняя функция приостановила работу, а затем вы бы запустили эту сопрограмму, а не пытались запустить внутри signInWithCoroutinesTest
.
Исходный пример не вполне реалистичен.но обычно вы запускаете подобные вещи из существующей области, возможно, связанные с вашей деятельностью или viewModel.В конечном счете, это выглядело бы примерно так:
fun hypotheticalLogic() {
...
viewModelScope.launch {
signInWithCoroutinesTest(email, password)
}
...
}
override suspend fun signInWithCoroutinesTest(email: String, password: String) {
view?.showProgress()
try {
signInInteractor.signIn(email,password))
} catch(e: AuthenticationException) {
view?.showError(e.message)
}
view?.hideProgress()
}
Ключевым моментом является просто думать о сопрограммах так же, как и о «нормальном» последовательном коде.