kotlinrx-javarx-java3retrywhen

RxJava's retryWhen unexpectedly keeps retrying forever


Can anyone …

  1. explain why the following code keeps retrying indefinitely, once retryWhen is called?
  2. correct the code to stop retrying when Random.nextBoolean() returns true?

I think there is a 50% chance that retryWhen is called because of Random.nextBoolean(). However, once it is called, it goes into an infinite loop.

import io.reactivex.rxjava3.core.Observable
import kotlin.random.Random

fun main() {
    Observable
        .just(Unit)
        .flatMap {
            if (Random.nextBoolean()) {
                Observable.just(Unit)
            } else {
                Observable.error(Throwable())
            }.retryWhen {
                it.flatMap {
                    println("retryWhen")
                    Observable.just(Unit)
                }
            }
        }
        .subscribe()
}

Output:

retryWhen
retryWhen
retryWhen
⋮
(continued)

Solution

    1. You've applied the retryWhen to the result of the execution of either branch of the if-statement.

    2. Chain the retryWhen operator to the stream produced by flatMap:

    e.g.

    Observable
      .just(Unit)
      .flatMap {
        if(Random.nextBoolean()) {
          Observable.just(Unit)
        } else {
          Observable.error(Throwable())
        }
      }
      .retryWhen {
          it.flatMap {
            println("retryWhen")
            Observable.just(Unit)
          }
      }
      .subscribe()