Класс API с использованием Retrofit
class interface TestApi {
@GET("/path/abc/xyz")
fun get(): Single
}
Класс UseCase
fun getResult(): Single {
return testApi.get()
.map{ response ->
val type = response.type
when(type){
null -> throw Exception()
else -> response
}
}
.retryWhen{ throwableHandler ->
throwableHandler.flatMap {
when(it) {
is Exception() -> Flowable.error(it)
else -> Flowable.timer(3,TimeUnit.SECONDS)
}
}
}
.timeout(60, TimeUnit.SECONDS)
}
MainClass.kt
usecase.getResult()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onError = {Log.d(TAG,"Error")},
onSuccess = {Log.d(TAG,"Next")})
При запуске приложения:
Если API возвращает NULL, вызывается retryWhen (), затем снова вызывается API.Событие не истекло, тайм-аут завершен, и API-интерфейс возвращает не NUL результат -> вызывается onSuccess.Это корректная обработка оператора retryWhen () в rxJava.
Моя проблема:
Если я напишу какой-нибудь метод тестирования (чтобы притвориться API Retrofit) в MainClass.kt, будет выглядеть так:
private fun testPretend(): Single<Animal> {
return Single.just(Animal)
}
MainClass.kt выглядит следующим образом:
testPretend()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onError = {Log.d(TAG,"Error")},
onSuccess = {Log.d(TAG,"Next")})
Таким образом, событие retryWhen вызывается, метод testPretend () больше не вызывается.В чем здесь проблема?
А в чем разница между Single return by testPrerend () и Retrofit API?