Когда я пытался войти в свой сервис через дооснащение. Когда моя служба отключена, через 10 секунд после нажатия кнопки я получил SocketTimeoutException
исключение. Пока все нормально, но снова я снова нажал кнопку после того, как ошибка сразу же выдала ту же ошибку. Что случилось?
interface LoginService {
@FormUrlEncoded
@POST("/login")
fun login(@Field("id") id: String, @Field("pw") pw: String): Deferred<Response<User>>
}
class LoginViewModel : ViewModel() {
private var job: Job = Job()
private val scope: CoroutineScope = CoroutineScope(Dispatchers.Main + job)
private val service by lazy { RetrofitApiFactory().create(LoginService::class.java) }
private val excHandler = CoroutineExceptionHandler { _, throwable ->
Timber.e(throwable);
}
fun doLogin(id: String, pw: String) {
scope.launch(excHandler) {
val response = service.login(id, pw).await()
if (response.isSuccessful) {
response.body()
?.let { user -> doOnSuccess(user) }
?: doOnError(InvalidUserException())
} else doOnError(Exception())
}
}
private fun CoroutineScope.doOnError(e: Throwable) {
excHandler.handleException(coroutineContext, e)
}
private fun doOnSuccess(user: User) {
...
}
override fun onCleared() {
job.cancel()
}
}
Response
, который может быть успешным или нет, затемDeferred
, который может быть завершен или отменен. В хорошем дизайне вместоDeferred
будетsuspend fun
, и он будет сигнализировать обо всех ошибках через исключения. Если вы получили ответ, значит, он успешен. - person Marko Topolnik   schedule 15.10.2018suspend fun
vs .Deferred
. - person Marko Topolnik   schedule 15.10.2018Deferred
. Выдает ошибку:java.lang.IllegalArgumentException: Unable to create call adapter for retrofit2.Response
- person kibar   schedule 15.10.2018Deferred
, но я думаю, что он также должен поддерживатьsuspend fun
. Вы объявили свою функцию какsuspend fun
? - person Marko Topolnik   schedule 15.10.2018suspend fun
появится сразу после выхода Kotlin 1.3. - person Marko Topolnik   schedule 15.10.2018