2016-04-04 61 views
10

即時通訊使用改進(1.9),並試圖找出我可以如何調用2 apis和合並結果。多個請求與改造合併結果

我想,當最後一個API完成返回響應結果應該合併...

我怎麼能這樣做呢?

UDPATE,按照Antons答案我曾嘗試以下:

加入到搖籃:

compile 'io.reactivex:rxjava:1.0.+' 
    compile 'io.reactivex:rxandroid:0.23.+' 

API接口

@GET("/maps/api/place/details/json") 
    Observable<PlaceDetailResult1> getPlacesFrom1(@Query("key") String key, @Query("placeid") String placeid); 


@GET("api/places/{id}/ratings") 
Observable<PlaceDetailResult2> getPlacesFrom2(@Path("id") String id); 

在片段

 IPlaces api = adapter.create(IPlaces.class); //endpoint1 
    IPlaces api2 = adapter2.create(IPlaces.class); //endpoint2 

    Observable.combineLatest(
      api.getPlacesFrom1("key", placeId), 
      api2.getPlacesFrom2(placeId), 
     new Func2<PlaceDetailResult1, PlaceDetailResult2, MergedReviews>() { 
      @Override 
      public MergedReviews call(PlaceDetailResult placeDetailResult1, PlaceDetailResult2 placeDetailResult2) { 
       // processToMerge( placeDetailResult1, placeDetailResult2) 
       return mr; 
      } 

      }) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<MergedReviews>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(MergedReviews mr) { 

        SetAdapter(mr.reviews); 
        SetPhotosAdapter(mr.photos); 
       } 
      }); 

一個事情aybe值得注意的是,當我加入RxJava到搖籃我是收到的一些錯誤,我在gradle這個文件

+0

使用RxJava進行改造 –

+0

@MD是RxJava是使用改造的唯一方法嗎? – raklos

+0

@raklos當然,您可以創建全局計數器並繼續執行結果,當計數器變爲零(如果您在成功響應後遞減)但這很痛苦,RxJava更安全,更酷,更容易 –

回答

4

您可以使用RxJava和結果相結合這樣做multiDexEnabled true之後就走了:Combining API calls with RX Java

這裏是教程,如何使用RxJava和改造1.9http://randomdotnext.com/retrofit-rxjava/

+0

改造1.9是否與您建議的SO鏈接中使用的方法兼容? – raklos

+0

你有沒有檢查鏈接? –

+0

是的,我檢查了兩個,我試圖執行SO帖子中的建議。並在調試它只是不會進入onnext方法... – raklos

32

我們在Android和結果相結合使用RxJava。我已經解釋每一步
讓我們先來定義我們的改造對象來訪問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的zip方法來結合我們的兩個Obserbles並等待它們在創建一個新的Observable之前完成。

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 
      } 
     }); 
+0

如果你有n個observable,例如可以是1-10? – Choletski

+0

zip似乎是阻塞的,我們可以使用'flatMap'或者那樣嗎? – ericn

+0

是的,你可以使用。這完全取決於要求 – Ramkailash

1

使用rxjava 2.X + Java的8拉姆達:

使用Oblables與Ramkailash的答案相同。

這樣創建郵編:

Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, (jsonObject, jsonArray) -> new UserAndEvents(jsonObject, jsonArray)); 

訂閱相結合觀察到:

Disposable disposable = combined.subscribe(this::successUserAndEvents,this::throwableError); 

private void successUserAndEvents(UserAndEvents o) { 
     // You can access the results of the 
     // two observabes via the POJO now 
} 

private void throwableError(Throwable throwable){ 
     // handle throwable 
} 

一次性處置不需要的時候:

@Override 
public void onStop() { 
    super.onStop(); 
    if (disposable != null) disposable.dispose(); 
} 
+0

任何想法當應用程序進入背景並進入前景時該做什麼 –