RxAndroid оператор повторяется, когда вызывается, но не подписывается - PullRequest
0 голосов
/ 29 ноября 2018
  1. Класс API с использованием Retrofit

    class interface TestApi {
      @GET("/path/abc/xyz") 
      fun get(): Single
    }
    
  2. Класс 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)
        }
        
  3. MainClass.kt

    usecase.getResult()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(onError = {Log.d(TAG,"Error")},
                         onSuccess = {Log.d(TAG,"Next")})
    
  4. При запуске приложения:
    Если 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?

1 Ответ

0 голосов
/ 29 ноября 2018

Метод testPretend() больше не вызывается, потому что наблюдаемое, что он вернул, - это то, на что переписывается.Если вы хотите, чтобы метод повторно вызывался при повторной подписке, вам нужно будет сделать что-то вроде этого:

Single.defer( () => testPretend() )
  ...
  .retryWhen( ... )
  ...;

Это вызовет testPretend() при повторной подписке.

...