我想異步執行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