我想异步执行 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
}
});
}
三个问题:
Observable.combineLatest
当您想要异步执行多个 REST 调用并在所有调用完成后继续时使用的最佳运算符? Func2
实现当前返回 String
.在 2 个 API 调用执行后,我将处理 Func2#call()
中的结果。方法。我不在乎返回什么——不过,必须有更好的方法来处理这个问题——我说得对吗? 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();
}
这看起来像我正在寻找的解决方案。我将使用它一段时间,看看我是否遇到任何麻烦。
请您参考如下方法:
1) 如果您知道在两条路径上都有一个值,那么它与 zip
一样好.
2)你想做什么?您将在 Func2
中获得一对值如果您真的不关心 onNext
的旅行内容,返回您选择的值。
3) Schedulers.immediate()
从某种意义上说,它不是真正的调度程序,并且很容易出现同池死锁场景。你真的不需要使用它。如果你想阻塞主线程直到异步工作完成,使用 toBlocking().first()
例如。