Java 如果在指定时间后未发出任何项,则超时
我有一个简单的操作,执行一个api调用,结果是一个Java 如果在指定时间后未发出任何项,则超时,java,android,rx-java,retrofit2,Java,Android,Rx Java,Retrofit2,我有一个简单的操作,执行一个api调用,结果是一个可观察的,它发出响应: apiService.getTeam() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Response>() { ... }); apiService.getTeam() .subscribeOn(Sche
可观察的
,它发出响应:
apiService.getTeam()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response>() {
...
});
apiService.getTeam()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新订户(){
...
});
如果几秒钟后没有项目发出,我想向用户提供一些反馈。我知道有.timeout()
操作符,但是这将应用于每个项目,因此即使发出了几个项目,在发出最后一个可用项目几秒钟后,超时也会导致错误
我只想在没有发出任何项的情况下使操作超时。有没有简单的方法可以解决这个问题?下面的代码片段可以解决您的问题:
public static void main(String[] args) {
boolean itemEmitted[] = { false };
long identifier = -1l;
Observable.interval(10, TimeUnit.SECONDS)
.mergeWith(Observable.just(identifier).delay(5, TimeUnit.SECONDS))
.map(v -> {
if (!itemEmitted[0] && v == identifier) { // item is not emitted and a timeout occurs
throw new RuntimeException("timeout");
}
itemEmitted[0] = true;
return v;
}).filter(v -> v != identifier).toBlocking()
.subscribe(v -> System.out.println(v));
}
Observable.interval
是您的源Observable
,它发出的项目与Observable.just
具有延迟
-其组合作用类似于超时
。输出可观察
为映射
ped,以检查是否发出了实际项目或是否发生了超时标识符
。如果超时,则抛出异常。稍后,对输出进行筛选
以从发出的项目列表中删除标识符
您可以通过修改initial
Observable中的值来使用此代码。interval
有一个超时
重载,您可以使用它来超时第一个元素,而不是超时其余元素:
Observable.never()
.timeout(() -> Observable.timer(1, TimeUnit.SECONDS), e -> Observable.never())
.toBlocking()
.subscribe(System.out::println, Throwable::printStackTrace);
在这里,第二个参数只是返回一个永远不会发出的可观测值,因此后续元素不会超时。检查此改装错误处理。