2017-02-19 93 views
1

第一個API調用返回一個元素列表,然後我希望隨後調用另一個API,其中第一個API調用將在列表的每個元素中返回String。我(認爲我)已經知道了,所以它正在調用與列表中的每個元素的第二個API調用,但我不確定如何訂閱以獲得第二個調用返回的結果。RxJava 2,Retrofit 2 + Retrolambda - 將2個請求鏈接在一起

discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       // Turns the result into individual elements 
       .flatMapIterable(RootSearchResponse::getSearchResults) 
       // I believe this then calls .getRelease() with each ID string 
       .map(result -> discogsService.getRelease(result.getId())); 

更新接口:

public interface DiscogsService 
{ 
    @GET("database/search?") 
    Observable<RootSearchResponse> getSearchResults(@Query("q") String searchTerm, @Query("token") String token); 

    @GET("releases/") 
    Observable<Release> getRelease(@Query("release_id") String releaseId); 
} 

我不確定在哪裏何去何從。

我相信.subscribe(...)然後讓我能夠得到從.getRelease(...)返回Observable<Release>。由於在模型層I中調用上述方法,則需要在該模型層中建立訂戶以返回Presenter,然後Presenter中的附加訂戶處理每個Observable,因爲Presenter可以訪問View

有沒有辦法讓我可以從模型層返回每個Observable,所以我不需要有兩個單獨的.subscribe(...) s?或者我應該使用兩個單獨的.subscribe(...) s,然後在它們兩個上發現錯誤?我只想要第二個電話的結果。

這裏是我已經試過全碼:

在型號:

discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .flatMapIterable(RootSearchResponse::getSearchResults) 
       .subscribeOn(Schedulers.io()) 
       .map(result -> discogsService.getRelease(result.getId())) 
       .subscribe(new Observer<Observable<Release>>() 
       { 
        @Override 
        public void onSubscribe(Disposable d) 
        { 

        } 

        @Override 
        public void onNext(Observable<Release> value) 
        { 
         mainPresenter.addToRecyclerView(value); 
        } 

        @Override 
        public void onError(Throwable e) 
        { 

        } 

        @Override 
        public void onComplete() 
        { 

        } 
       }); 

在主講人:

@Override 
public void addToRecyclerView(Observable<Release> value) 
{ 
    value  .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(new Observer<Release>() 
       { 
        @Override 
        public void onSubscribe(Disposable d) 
        { 

        } 

        @Override 
        public void onNext(Release value) 
        { 
         Log.e(TAG, "Success! " + value); 
         results.add(value); 
        } 

        @Override 
        public void onError(Throwable e) 
        { 
         Log.e(TAG, "Error: " + e.toString()); 
         Log.e(TAG, "Error: " + e.toString()); 
        } 

        @Override 
        public void onComplete() 
        { 

        } 
       }); 
+1

我已閱讀您的問題5次,並且無法理解。你能改述一下嗎? – Divers

+0

請說明你如何使用'subscribe',因爲這是你需要做的。舉一個例子描述「不良結果」,你至少需要訂閱 –

+0

這兩個web服務調用並獲得他們兩個的結果,然後對結果做些什麼? – MBH

回答

0

我寧願暴露的Observable<Release>在模型等級:

Observable<Release> getReleases(...) { 
    return discogsService.getSearchResults(...) 
     .flatMapIterable(RootSearchResponse::getSearchResults) 
     .flatMap(result -> discogsService.getRelease(result.getId())); 
} 

演示只想訂閱它:

getReleases 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(new Observer<Release>() 
    { 
     @Override 
     public void onSubscribe(Disposable d) 
     { 

     } 

     @Override 
     public void onNext(Release value) 
     { 
      Log.e(TAG, "Success! " + value); 
      results.add(value); 
     } 

     @Override 
     public void onError(Throwable e) 
     { 
      Log.e(TAG, "Error: " + e.toString()); 
      Log.e(TAG, "Error: " + e.toString()); 
     } 

     @Override 
     public void onComplete() 
     { 

     } 
    }); 

只有一個觀測。請注意從map()flatMap()的切換,請參閱getReleases(...)中的第二個請求。在幕後,這是第二次訂閱的地方。

最終訂閱將收到來自這兩個請求的錯誤。我更願意讓消費者(Presenter)處理錯誤,因爲它是關心響應的人,並知道在發生錯誤時應如何處理(例如顯示消息)。

這是一個'驅動'Observable,誰創建,處置它,所以這也是他的責任,分配線程恕我直言。

Observable使得從一層到另一層暴露出非常好的合同。它描述了數據類型,如何使用它以及模式(Observable?Single?Flowable?)。