我正在将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
});
。我有什么建议可以实现这个目标吗?
答案 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();
}
});
}
这对我很有用,在一个非常基本的情况下,我希望它可以帮助你。