我喜欢做类似的事情:http://joluet.github.io/blog/2014/07/07/rxjava-retrofit/
我有3个休息电话。第一个进入第二个。但是,第三次通话没有任何内容。我只需要确保它在第二次运行后运行。所以我正在寻找像"链"方法在这里:
result1Observable.subscribe(new Observer<result1>() {
@Override public void onNext(result1 firstRestCallResult) {
restCall2(firstRestCallResult).chain(restCall3);
}
}
答案 0 :(得分:0)
因为您的restCall3
可能不会返回任何内容,因此通常的map
,flatMap
等操作符可能有点棘手 - 类型不会排队。
有点难看,但可能会使用mergeWith
运算符。您的restCall3
只会调用onCompleted()
,不会发出任何值。将事物保留在Observable
链中应该确保如果任何错误或无法完成整个链的任何操作都会出错或无法完成(包括restCall3
)。
public Observable<UserStatus> execChain() {
return login()
.flatMap(responseBody -> getUserStatus(responseBody)
.mergeWith(restCall3()));
}
public Observable<ResponseBody> login() {
...
}
public Observable<UserStatus> getUserStatus(ResponseBody responseBody) {
...
}
public <T> Observable<T> restCall3() {
return Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
//execute blocking call
performRestCall();
subscriber.onCompleted();
}
});
}
[注意:我实际上没有尝试过前面的代码]
我认为restCall3
成功完成对你很重要。如果您不特别在意,可能会flatMap
前两个Observables
并使用doOnCompleted
而Rx应该确保只有 才会被调用前面的Observables
成功完成。