2017-02-19 91 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?)。