【发布时间】:2016-08-03 16:15:15
【问题描述】:
我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成此操作。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。
我的代码如下所示:
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
}
});
}
三个问题:
- 当您希望异步执行多个 REST 调用并在所有调用完成后继续执行时,
Observable.combineLatest是不是最适合使用的运算符? - 我的
Func2实现当前返回String。在 2 个 API 调用执行后,我将在Func2#call()方法中处理结果。我不在乎返回什么 - 但是必须有更好的方法来处理这个 - 我是正确的吗? - API 调用使用上面的代码正确执行。但是当我运行程序时,
main方法并没有以正确的Process finished with exit code 0完成。什么可能导致代码挂起?
更新 - 2015-05-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();
}
这看起来像我正在寻找的解决方案。我打算用一段时间看看有没有什么问题。
【问题讨论】: