我想异步执行2个网络调用 - 我正在使用Retrofit + RxJava来完成此操作。这个逻辑来自一个简单的Runner类来测试解决方案。注意:这主要涉及服务器端的RxJava。正确使用Retrofit + RxJava的combineLatest
我的代码如下所示:
public static void main(String[] args) throws Exception {
Api api = ...;
Observable.combineLatest(
api.getStates(),
api.getCmsContent(),
new Func2<List<States>, CmsContent, String>() {
@Override public String call(List<State> states, CmsContent content) {
...
return "PLACEHOLDER";
}
})
.observeOn(Schedulers.immediate())
.subscribeOn(Schedulers.immediate())
.subscribe(new Observer<String>() {
@Override public void onCompleted() {
System.out.println("COMPLETED");
}
@Override public void onError(Throwable e) {
System.out.println("ERROR: " + e.getMessage());
}
@Override public void onNext(String s) {
// I don't care what's returned here
}
});
}
三个问题:
- 是
Observable.combineLatest
使用时要执行多个REST异步调用,并继续在所有呼叫都完成了最好的操作?我的Func2
实现当前返回String
。在执行2个API调用之后,我将在Func2#call()
方法中处理结果。我不在乎什么是返回 - 但是,我必须有更好的方法来处理这个问题 - 我是否正确? - 使用上面的代码正确执行API调用。但是当我运行该程序时,
main
方法没有用正确的Process finished with exit code 0
来完成。什么可能导致代码挂起?
更新 - 2015年5月14日
基础上的建议,我已经改变了逻辑如下:
public static void main(String[] args) throws Exception {
Api api = ...;
Observable.zip(
api.getStates(),
api.getCmsContent(),
new Func2<List<States>, CmsContent, Boolean>() {
@Override public Boolean call(List<State> states, CmsContent content) {
// process data
return true;
}
})
.subscribeOn(Schedulers.io())
.toBlocking()
.first();
}
这看起来像解决我是寻找。我打算用一段时间来看看是否遇到麻烦。
谢谢,我已经使用您的建议更新了我的代码示例。 – Kasa