2016-11-12 70 views
1

我想要得到google places和每個API限制你不能得到超過20個地方每個請求,下一個請求需要nextPageToken以前的請求。多個順序觀察與及時之間的延遲每個人之間

問題:

  • Zip運營商立即執行所有要求,但我需要他們的Observable呼叫

  • Delay操作4 seconds之間的每個

    允許等待連續的,及時的延遲,但它到底是什麼,它立即執行Zip來電和未期望在延遲一定時間後返回我的結果。

我的資料來源:

LatLng some = new LatLng(31.471199, 74.234940); 
Observable 
     .zip(getNearByPlaces(some), getNearByPlaces(some), getNearByPlaces(some), new Func3<List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>>() { 
      @Override 
      public List<PlaceInfo> call(List<PlaceInfo> placeInfos, List<PlaceInfo> placeInfos2, List<PlaceInfo> placeInfos3) { 
       placeInfos2.addAll(placeInfos3); 
       placeInfos.addAll(placeInfos2); 
       return placeInfos; 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Observer<List<PlaceInfo>>() { 
      @Override 
      public void onCompleted() { 
      } 

      @Override 
      public void onError(Throwable e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onNext(List<PlaceInfo> placeInfos) { 
       adapter.setPlaces(placeInfos); 
      } 
     }); 

我是初學者,使用rxjava約1星期前開始,所以你可以期待的錯誤。

+0

你好?????????? –

回答

1

讓我們假設你有以下響應模型

class Response { 
    private String pageToken; 
    private List<PlaceInfo> places; 

    //setters, getters etc 
} 

而且有兩個方法:用API

Observable<Response> getNearByPlaces(LatLng latLng) {...} 
Observable<Response> getNextNearByPlaces(String pageToken) {...} 

工作定義Transformer獲取額外的地方。它等待4秒鐘,然後獲取下一個地方並添加源地點到響應中。

private Observable.Transformer<Response, Response> addNextPlaces() { 
    return observable -> observable 
      .delay(4, TimeUnit.SECONDS) 
      .flatMap(sourceResponse -> getNextNearByPlaces(sourceResponse.getPageToken()), 
        ((sourceResponse, nextResponse) -> { 
         nextResponse.getPlaces().addAll(sourceResponse.getPlaces()); 
         return responseNext; 
        })); 
} 

然後,你可以做什麼,你需要這樣

getNearByPlaces(latLng) 
     .compose(addNextPlaces()) 
     //add here additional compose methods if you need them 
     .subscribe(resultResponse -> { 
      resultResponse.getPlaces() //handle result List 
     }, error -> { 
      //handle error 
     }); 

附:瞭解線程。 delay切換計劃程序來computation

P.P.S.我懷疑還有一種更簡單和優雅的解決方案:)

+0

謝謝,它的工作,只是最後一個問題是,它的三個請求過程,但上面的示例處理2請求我想 –

+0

'.compose(addNextPlaces())'添加一個額外的請求,所以如果你想鏈更多的請求 - 只需複製粘貼該字符串並將其放置在下面 –