设置超时直到Observable的数据完成

时间:2017-11-23 06:55:37

标签: java rx-java

每个项目有一个rx.Observable.timeout但不是所有数据。 但是如果在特定时间段内没有发出数据,我需要一个时间表。

final Subscriber<Integer> sub = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer num) {


                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {}
                System.out.println(num);
            }

            @Override
            public void onCompleted() {
                System.out.println("--------------- Done ---------------");
            }

            @Override
            public void onError(Throwable e) {
                //System.out.println("Error!!! + e");
            }
        };

        Observable.range(1, 10000)
        .map(x -> x * 10)
        //.last()
        .timeout(10, TimeUnit.SECONDS)
        .doOnError( e -> {System.out.println("Errrorrr " + e);})
        .subscribe(sub);

2 个答案:

答案 0 :(得分:1)

您可以将takeUntil(Observable) timer()映射到例外:

source.takeUntil(
    Observable.timer(10, TimeUnit.SECONDS)
    .flatMap(ignored -> Observable.error(new TimeoutException()))
)
.subscribe(/* ... */);

答案 1 :(得分:0)

使用两个来源:一个发出数据,一个在延迟后抛出超时异常。合并两者:

Observable timeoutObservable = Observable.error(new TimeoutException())
    .delay(10, TimeUnit.SECONDS, true);
return Observable.merge(dataObservable, timoutObservable);