循环,直到RxJava中的条件变为真

循环,直到RxJava中的条件变为真,java,rx-java,Java,Rx Java,我希望我的代码重复某个异步操作,直到该操作成功(即,直到返回true) 目前,我正在使用以下解决方法: Supplier<Observable<Boolean>> myOperation = () -> { // do something useful and return 'true' if it was successful // NOTE: GENERATING A RANDOM NUMBER IS JUST AN EXAMPLE HERE //

我希望我的代码重复某个异步操作,直到该操作成功(即,直到返回
true

目前,我正在使用以下解决方法:

Supplier<Observable<Boolean>> myOperation = () -> {
  // do something useful and return 'true' if it was successful
  // NOTE: GENERATING A RANDOM NUMBER IS JUST AN EXAMPLE HERE
  // I WANT TO RUN AN ASYNCHRONOUS OPERATION (LIKE PINGING A SERVER
  // OR THE LIKE) AND RETRY IT UNTIL IT SUCCEEDS.
  System.out.println("Try");
  return Observable.just(Math.random() > 0.9);
};

final Throwable retry = new IllegalStateException();

Observable.<Boolean>create(subscriber -> {
  myOperation.get().subscribe(subscriber);
}).flatMap(b -> b ? Observable.just(b) : Observable.error(retry))
  .retryWhen(exceptions -> exceptions.flatMap(exception -> {
    if (exception == retry) {
      return Observable.timer(1, TimeUnit.SECONDS);
    }
    return Observable.error(exception);
  }))
  .toBlocking()
  .forEach(b -> {
    System.out.println("Connected.");
  });
代码符合我的要求,但看起来不太优雅。我相信一定有更好的办法。可能通过使用自定义的
运算符


有人知道如何在RxJava中实现同样的功能,但要以更可读的方式实现,而且不需要人工的
可丢弃的

时间不够,所以这将是通过内存实现的

public class Randomizer implements Iterable<Double>, Iterator<Double> {
  public Iterator<Double> getIterator() {return this;}
  public boolean hasNext() {return true;}
  public Double next() {return Math.random();}
}

...

Observable.from(new Randomizer())
          .takeWhile(value -> value < 0.99);
// or takeUntil(value -> value > 0.99); can't remember their differences.

请记住,如果使用改型,则不需要延迟(),因为改型将在新订阅发生时重新启动呼叫。

谢谢。我很难将你的解决方案映射到我的问题上。我想重试异步操作,直到它成功。生成随机数只是这里的一个例子。
public class Randomizer implements Iterable<Double>, Iterator<Double> {
  public Iterator<Double> getIterator() {return this;}
  public boolean hasNext() {return true;}
  public Double next() {return Math.random();}
}

...

Observable.from(new Randomizer())
          .takeWhile(value -> value < 0.99);
// or takeUntil(value -> value > 0.99); can't remember their differences.
Observable.defer(() -> createConnectionObservable())
          .retry((count, err) -> {
              if(count>9) return false;
              if(!(err instanceof IOException)) return false;
              return true;
          })