Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava2-如何每次重试,除非它';什么是超时例外?_Android_Rx Java_Rx Java2 - Fatal编程技术网

Android RxJava2-如何每次重试,除非它';什么是超时例外?

Android RxJava2-如何每次重试,除非它';什么是超时例外?,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我有一系列的可观察对象,最后,我通过蓝牙向设备发送命令,等待通知。有一种情况,它可以永远在这里等待,所以我想使用timeout-简单 但问题是,每次发生任何其他问题时,我都想重试,只有当超时发生时,才应该终止它,否则它应该重试。此外,如果我们沿着链往下走,我们将遇到其他重试,它们也应该具有相同的行为。超时异常应该被推回到更高层(在我的例子中是interactior) 我考虑了retryWhen,但我不确定在这种情况下如何正确使用它 .retryWhen { it.filter { throwab

我有一系列的
可观察对象
,最后,我通过蓝牙向设备发送命令,等待通知。有一种情况,它可以永远在这里等待,所以我想使用
timeout
-简单

但问题是,每次发生任何其他问题时,我都想
重试
,只有当
超时
发生时,才应该终止它,否则它应该
重试
。此外,如果我们沿着链往下走,我们将遇到其他重试,它们也应该具有相同的行为。超时异常应该被推回到更高层(在我的例子中是interactior)

我考虑了
retryWhen
,但我不确定在这种情况下如何正确使用它

.retryWhen { it.filter { throwable -> throwable !is TimeoutException } }

而且,很难为此编写测试,因此我很难找到正确的解决方案

请尝试我在项目中使用的以下方法

创建一个类(这是一个java类,如果需要,您可以将其更改为kotlin)


每5分钟重试3次。

@Denathan很高兴知道它有帮助
public class RetryWithDelay implements Function<Observable<? extends Throwable>, Observable<?>> {
private static final String TAG = "RetryWithDelay";

private final int maxRetries;
private final int retryDelayInMinutes;
private int retryCount;



public RetryWithDelay(final int maxRetries, final int retryDelayInMinutes) {
    this.maxRetries = maxRetries;
    this.retryDelayInMinutes = retryDelayInMinutes;
    this.retryCount = 0;
}

@Override
public Observable<?> apply(Observable<? extends Throwable> attempts) {
    return attempts.flatMap(new Function<Throwable, Observable<?>>() {
        @Override
        public Observable<?> apply(Throwable throwable) {
            if (throwable instanceof TimeoutException) {
                return Observable.error(throwable);
            }

            if (++retryCount < maxRetries) {
                // When this Observable calls onNext, the original
                // Observable will be retried (i.e. re-subscribed).
                return Observable.timer(retryDelayInMinutes, TimeUnit.MINUTES);
            }

            // Max retries hit. Just pass the error along.
            return Observable.error(throwable);
        }
    });
}}
  .retryWhen (new RetyWithDelay(3,5))