Używam Kotlin współprogram na zamówienie sieci przy użyciu metody rozszerzenie zadzwonić klasę w modernizowanych jak tenJak wykładniczy wycofywania ponownie na Kotlin współprogram
public suspend fun <T : Any> Call<T>.await(): T {
return suspendCancellableCoroutine { continuation ->
enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>?, response: Response<T?>) {
if (response.isSuccessful) {
val body = response.body()
if (body == null) {
continuation.resumeWithException(
NullPointerException("Response body is null")
)
} else {
continuation.resume(body)
}
} else {
continuation.resumeWithException(HttpException(response))
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
// Don't bother with resuming the continuation if it is already cancelled.
if (continuation.isCancelled) return
continuation.resumeWithException(t)
}
})
registerOnCompletion(continuation)
}
}
następnie z wywołaniem strony używam powyżej sposobu jak ten
private fun getArticles() = launch(UI) {
loading.value = true
try {
val networkResult = api.getArticle().await()
articles.value = networkResult
}catch (e: Throwable){
e.printStackTrace()
message.value = e.message
}finally {
loading.value = false
}
}
Chcę, aby wykładniczy ponowić wezwanie api w niektórych przypadkach, tj. (Wyjątek IOEception), w jaki sposób mogę to osiągnąć?
wow bardzo fajna odpowiedź dzięki –
To było coś, co znajdowało się z tyłu mojej głowy dla już kilka dni. Cieszę się, że rozwiązanie nie jest bardziej skomplikowane niż to, co sobie wyobrażałem. Zadaję sobie także pytanie, czy sensowne byłoby zdefiniowanie tej funkcji pomocniczej jako funkcji inline. I na koniec, co nie mniej ważne: w jaki sposób zmodyfikować a, jeśli chcesz wykonać ponowienie tylko po zapytaniu użytkownika (np. W dialogu)? –
Również o wiele czystsze niż rozwiązanie Rx: -O – kenyee