RX java retryWhen,计时器未重新订阅可观察 描述
所以我有一个可观察的,比如说RX java retryWhen,计时器未重新订阅可观察 描述,java,android,networking,timer,rx-java,Java,Android,Networking,Timer,Rx Java,所以我有一个可观察的,比如说getDataObservable,它有时会失败并发出错误,但有时我需要它重试几次。 然后我使用retryWhen(…)操作符,比如getDataObservable.retryWhen(…) 在这个操作符中,我必须给它一个函数,该函数取参数可观测(包含发出的错误),并返回任何类型的可观测的可观测 我想 根据我对文档中所读内容的理解,该操作员.retryWhen(…)使用从给定函数返回的可观测值来订阅它,如果它发出任何表示我被要求重新订阅的信息 togetDataO
getDataObservable
,它有时会失败并发出错误,但有时我需要它重试几次。然后我使用
retryWhen(…)
操作符,比如getDataObservable.retryWhen(…)
在这个操作符中,我必须给它一个函数,该函数取参数
可观测
(包含发出的错误),并返回任何类型的可观测的可观测
我想 根据我对文档中所读内容的理解,该操作员
.retryWhen(…)
使用从给定函数返回的可观测值来订阅它,如果它发出任何表示我被要求重新订阅的信息
togetDataObservable
再次重试,但如果返回的observable发出错误,则表示否,请勿重试
问题 到目前为止还不错,但当我从该函数返回一个
可观察的计时器(…)
(这是一个可观察的,经过一些延迟后才发出long
值)时,我认为.retryWhen(…)
应该订阅它,并等待直到它发出一个值,告诉它是的,然后重新订阅给你的父母
但是,它直接完成,无需等待
可能是线程问题,或者我对操作符如何工作的理解是错误的,我需要与
observatalbe.timer(…)
一起解决这个问题。以前遇到过这种问题的人都很乐意听到答案
注意:下面的类是它传递给.retryWhen(…)
的函数的换行符,而不是.retryWhen(newfunc1>(){…})
我使用
.rertyWhen(new-RetryWhenObservable(51000))
只是为了将重试逻辑封装进去。public class RetryWhenObservable implements Func1<Observable<? extends Throwable>, Observable<?>> {
private static final String TAG = "RetryWhenObservable";
int maxRetry, interval,retryCount = 0;
public RetryWhenObservable(int maxRetry, int interval) {
this.maxRetry = maxRetry;
this.interval = interval;
}
@Override
public Observable<?> call(Observable<? extends Throwable> attempts) {
return attempts.flatMap(throwable -> {
if (++retryCount < this.maxRetry) {
return Observable.timer(interval,TimeUnit.SECONDS);
}else
return Observable.error(throwable);
});
}
}
public类RetryWhenObservable实现Func1>{
私有静态最终字符串TAG=“RetryWhenObservable”;
int maxRetry,interval,retryCount=0;
public RetryWhenObservable(int-maxRetry,int-interval){
this.maxRetry=maxRetry;
这个。间隔=间隔;
}
@凌驾
公共可观察调用(Observable似乎我使用这个类的方式是错误的.retryWhen(新的RetryWhenObservable(51000))
并且它愿意以1秒的时间间隔尝试5次,但没有注意到该类中使用的单位是TimeUnit.SECONDS
,因此它只运行一次可观测值,然后等待再等待愚蠢的错误:P
我修改了类以在将来克服这个问题,然后构造函数看起来像新的RetryWhenObservable(51000,TimeUnit.MILLIS)
来指定使用的时间单位
PS:调试时,请先仔细检查代码中的愚蠢部分。我似乎是这样错误地使用了此类。retryWhen(new RetryWhenObservable(51000))
并且它愿意以1秒的时间间隔尝试5次,但没有注意到该类中使用的单位是TimeUnit.SECONDS
,因此它只运行一次可观测值,然后等待再等待愚蠢的错误:P
我修改了类以在将来克服这个问题,然后构造函数看起来像新的RetryWhenObservable(51000,TimeUnit.MILLIS)
来指定使用的时间单位
PS:调试时,请先仔细检查代码中的愚蠢部分。可能您的源代码只是简单地完成了,没有错误,因此retryWhen没有任何事情可做。是否调用尝试.flatMap
中的lambda?也可以在订阅的所有订阅者之间共享maxRetry
e
retryWhen
返回的返回值可能不会导致重试。另外,请检查您不要简单地忽略retryWhen
的返回值并订阅原始源代码。我使用一个只发出onError的observable测试了这一点,因此我可以测试逻辑平面图和返回函数只调用一次,然后就没有了事情发生了没有未完成没有错误没有重新订阅原始可观察的内容这是在哪里运行的?在单元测试中,你必须以阻塞的方式等待源终止,否则单元测试的线程将继续。你还告诉计时器等待1000秒。这对我来说正如预期的那样有效:谢谢你我会检查它,但我已经尝试过了n单元测试和在android设备上的单元测试中,我考虑了线程问题,我总是在那种情况下告诉线程睡眠以便观察到完成,也许你的源代码只是在没有错误的情况下完成,所以retryWhen没有任何事可做。是否调用尝试.flatMap
中的lambda?也maxRetry
可以在订阅可观察的的所有订阅者中共享retryWhen
返回的返回值可能不会导致重试。另外,请检查您不要简单地忽略retryWhen
的返回值并订阅原始源。我使用只发出onError的可观察值测试了这一点,以便测试逻辑flat map和return函数只调用一次,然后什么都没有发生没有完成没有错误没有重新订阅原始可观察的nothing这在哪里运行?在单元测试中,您必须以阻塞的方式等待源终止,否则单元测试的线程将继续运行。您还可以告诉计时器等待1000秒。这是正如预期的那样对我有效:谢谢,我会检查它,但我在单元测试中尝试了它,在android设备上,在单元测试中我考虑了线程问题,我总是在那种情况下告诉线程休眠,以便完成