分步: - >讓我們先來定義我們的改造對象來訪問GitHub的API,然後創建了兩個觀測對上述兩種網絡請求:
Retrofit repo = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Observable<JsonObject> userObservable = repo
.create(GitHubUser.class)
.getUser(loginName)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<JsonArray> eventsObservable = repo
.create(GitHubEvents.class)
.listEvents(loginName)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
改造界面很簡單足夠:
public interface GitHubUser {
@GET("users/{user}")
Observable<JsonObject> getUser(@Path("user") String user);
}
public interface GitHubEvents {
@GET("users/{user}/events")
Observable<JsonArray> listEvents(@Path("user") String user);
}
最近,我們使用RxJava的郵遞方法向我們兩個觀測量結合起來,等待他們創造一個新的可觀測之前完成。
Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, new Func2<JsonObject, JsonArray, UserAndEvents>() {
@Override
public UserAndEvents call(JsonObject jsonObject, JsonArray jsonElements) {
return new UserAndEvents(jsonObject, jsonElements);
}
});
有什麼UserAndEvents?這只是一個簡單的POJO兩個對象組合:
public class UserAndEvents {
public UserAndEvents(JsonObject user, JsonArray events) {
this.events = events;
this.user = user;
}
public JsonArray events;
public JsonObject user;
}
最後,讓我們呼籲訂閱方法我們新的組合可觀察到:
combined.subscribe(new Subscriber<UserAndEvents>() {
...
@Override
public void onNext(UserAndEvents o) {
// You can access the results of the
// two observabes via the POJO now
}
});
我一直在遇到的問題是,我有一種觀點,即我解除了視頻觀察視圖的任務,另一視圖觀察到了另一個視圖,而另一個視圖應該同時採用這些結果並將它們用於最終的可觀察視圖。 。zip會將已經執行的可觀察結果返回給我嗎? – feilong
我不認爲你可以執行observable,但我想我理解你的觀點。只有在附屬於附屬服務器的情況下,Observable纔會運行。所以整個可觀察的安排必須在你附加用戶之前完成。 – inmyth
我同意你的觀點,即「zip運算符允許你從兩個不同的可觀察結果組成結果」。現在我想要observable 2依賴於observable 1,所以observable 1應該在observable 2之前執行,然後我需要結合兩個observable的結果。我們是否有這方面的運營商?拉鍊可以做這份工作。我不想使用flatMap,因爲它將一個流轉換爲另一個流,但在這裏我需要設置依賴關係,然後壓縮結果。請回復。 –