2016-11-12 7 views
1

Ich versuche, google places zu bekommen und wie pro API Einschränkung können Sie nicht mehr als 20 Plätze pro Anfrage erhalten, und nächste Anfrage erfordern nextPageToken der vorherigen Anfrage.Mehrere sequentielle Observables mit rechtzeitiger Verzögerung zwischen jedem von ihnen

Problem:

  • Zip Betreiber alle Anfragen sofort ausgeführt, aber ich brauche sie sequentielle und rechtzeitige Verzögerung von 4 seconds zwischen jedem Observable Anruf

  • Delay Operator sein kann warten, aber was es wirklich ist, dass es sofort Zip Anrufe ausführt und mir Ergebnisse nach der gegebenen Zeit in der Verzögerung zurückgibt, die nicht gewünscht wird.

Meine Quelle:

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

ich Anfänger bin und begann etwa 1 Woche vor mit rxjava, so können Sie Fehler erwarten.

+0

Hallo ?????????? –

Antwort

1

die Sie Nehmen wir an, haben folgende Antwortmodell

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

    //setters, getters etc 
} 

Und Sie haben zwei Methoden mit

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

Transformer definieren zusätzliche Plätze zu holen. Es wartet 4 Sekunden, holt dann die nächsten Plätze und fügt Quellplätze in die Antwort ein.

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

Dann können Sie tun, was Sie

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. auf diese Weise brauchen Achten Sie auf Threading. delay Schalter Scheduler zu computation

P.P.S. Ich vermute, dass es eine einfachere und anmutige Lösung gibt :)

+0

Danke, es hat funktioniert, nur ein letztes Problem ist, dass es ein Prozess mit drei Anfragen ist, aber über Beispiel behandelt 2 Anfrage ich nehme –

+0

'.compose (addNextPlaces())' fügt eine zusätzliche Anfrage hinzu, also wenn Sie mehr Anfragen ketten wollen - Kopieren Sie einfach diese Zeichenfolge und fügen Sie sie ein –

Verwandte Themen