gpt4 book ai didi

java - 循环直到条件在 RxJava 中变为真

转载 作者:行者123 更新时间:2023-11-30 10:40:44 27 4
gpt4 key购买 nike

我希望我的代码重复某个异步操作,直到该操作成功(即直到它返回 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.");
});

它运行良好并打印出如下内容:

Try
Try
...
Try
Connected.

代码可以满足我的要求,但看起来不是很优雅。我相信一定有更好的方法。也许通过使用自定义 Operator

有没有人知道如何在 RxJava 中以更易读的方式实现同​​样的事情并且没有人为的 Throwable

最佳答案

时间不够,只能靠内存了...

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.

OTOH 如果您需要做一些更复杂的事情,请查看 Observable.defer() 和/或 BehaviorSubject

编辑:现在有更多时间阅读您的帖子,您可以尝试这样的操作:

Observable.defer(() -> createConnectionObservable())
.retry((count, err) -> {
if(count>9) return false;
if(!(err instanceof IOException)) return false;
return true;
})

请记住,如果您使用 Retrofit,则不需要 defer(),因为 retrofit 会在发生新订阅时重新发起调用。

关于java - 循环直到条件在 RxJava 中变为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38781907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com