2016-11-12 6 views
1

私はgoogle placesを取得しようとしていますが、リクエストごとに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); 
      } 
     }); 

私は初心者だと約1週間前のためrxjavaを使い始めたので、あなたはミスを期待することができます。

+0

こんにちは?????????? –

答えて

1

は、あなたが応答モデル

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

    //setters, getters etc 
} 

を以下持っていて、追加の場所を取得するためにTransformerを定義するAPIを

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

を動作するように2つのメソッドを持っていると仮定しましょう。それは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 
     }); 

P.S.を行うことができますスレッド化に注意してください。 delayは、スケジューラをcomputationに変更します。

P.P.Sに切り替えます。私はもっ​​とシンプルで優雅な解決策があると思う:

+0

ありがとうございます、最後の問題は3つのリクエストプロセスですが、上記のサンプルは2つのリクエストを処理しています。 –

+0

'.compose(addNextPlaces())'はリクエストを1つ追加するので、 - この文字列をコピーして貼り付けて下に置きます –