SkipWhile方法在RxJava中无法正常工作


boolean isRetryButtonClicked = false;
.retryWhen(throwableFlowable -> throwableFlowable.skipWhile(throwable -> !isRetryButtonClicked)
.doOnNext(throwable -> Log.w("...", "doOnNext"))
.doOnComplete(() -> Log.w("...", "doOnComplete"))
.doOnError(throwable -> Log.w("...", "doOnError " + throwable))
.doOnSubscribe(subscription -> Log.w("...", "doOnSubscribe")))

如果isRetryButtonClicked变量为false,那么它将不会打印doOnNext,这没关系,因为我告诉它在isRetryButtonClicked等于false时跳过,但当用户单击重试按钮时,我会将isRetryButtonClicked值更改为true,之后它必须开始打印doOnNext,但当前结果仍然没有打印任何内容。

retryWhen需要一个信号来执行来自该内部源的重试。然而,isRetryButtonClicked是一个字段,因此对它的更改不是信号。你需要的是Subject。例如:

PublishSubject<String> subjectToRetry = PublishSubject.create();
source.retryWhen(errors -> errors.zipWith(subjectToRetry, (e, s) -> s))
.doOnNext(throwable -> Log.w("...", "doOnNext"))
.doOnComplete(() -> Log.w("...", "doOnComplete"))
.doOnError(throwable -> Log.w("...", "doOnError " + throwable))
.doOnSubscribe(subscription -> Log.w("...", "doOnSubscribe")))
// inside the retryButton's click handler:
subjectToRetry.onNext("Doit!");

最新更新