RxJava在10secs之后发送onError()

时间:2016-11-14 15:26:59

标签: android rx-java rx-android

我正在将Android应用中的不同操作与RxJava结合起来,我希望流成功完成并提交onNext()中的项目或10秒后的项目{{1将被抛出。

我用onError尝试了类似的东西:

timeout

但是这会在任何情况下抛出超时,如果上面列出的流程在10秒内没有成功完成,我只想跳转到Observable.from(list) .doOnNext(new Action1<List<String>>() { @Override public void call(List<String> list) { //do something here } }) .filter(new Func1<List<String>>, Boolean>() { @Override public Boolean call(List<String> list) { return list != null; } }) .flatMap(new Func1<List<String>>, Observable<MyResponse>>() { @Override public Observable<MyResponse> call(List<String> list) { //flatmap something here return Observable.just(new MyResponse(list)); } }) .flatMap(new Func1<MyResponse, Observable<AnotherResponse>>() { @Override public Observable<AnotherResponse> call(MyResponse myResponse) { //do something here return Observable.just(new AnotherResponse(myResponse)); } }) .timeout(10, TimeUnit.SECONDS) .subscribe(new Subscriber<AnotherResponse>()) { //do Subscription stuff here }); 。我有什么建议可以实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

正如克里斯托弗在评论中所说,你得到错误的原因是timeout每当未完成的Observable(TimeoutException尚未被调用)失败时将抛出onCompleted在设定的超时时间内产生下一个onNext

由于我不确定您的源Observable是什么 - 或者更确切地说,flatMap中的Observable - 正在做什么我会首先检查它是否应该实际生成onCompleted(可能至少在一个之后) onNext)或者它是否“按设计”保持打开状态(可能是源是开放式流,如设备的网络状态)。如果源本身是设计开放式的,您可以在第一个onCompleted之后人工引入onNext,只需将take(1)添加到您的链中即可。

答案 1 :(得分:1)

也许这可以帮到你。

private Observable<String> myMethod(final List<String> list) {
    return Observable.create(new Observable.OnSubscribe<String>() {
        @Override public void call(final Subscriber<? super String> subscriber) {

            // Your long lasting operation
            Observable<String> listObservable = Observable.from(list);

            // This is just my way to make slow operation (I have 10 items in my list)
            Observable<String> delayedObservable = listObservable.zipWith(Observable.interval(2, TimeUnit.SECONDS), new Func2<String,
                    Long,
                    String>() {
                @Override public String call(String s, Long aLong) {
                    return s;
                }
            });
            delayedObservable.subscribe(subscriber);

            Runnable r = new Runnable() {
                @Override public void run() {
                    // This thread makes the timeout, it is up to you if you would keep this like this.
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    subscriber.onError(new TimeoutException());
                    subscriber.onCompleted();
                }
            };
            Thread thread = new Thread(r);
            thread.start();
        }
    });
}

这对我很有用,在一个非常基本的情况下,我希望它可以帮助你。