Java 如果在指定时间后未发出任何项,则超时

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

我有一个简单的操作,执行一个api调用,结果是一个
可观察的
,它发出响应:

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);
在这里,第二个参数只是返回一个永远不会发出的可观测值,因此后续元素不会超时。

检查此改装错误处理。