2016-11-25 1 views
0

Ich habe Presenter, die getShops() -Methode aufruft.Wie mehrere Anfragen mit reaktiven android und nachrüsten

Observable<List<Shop>> observable = interactor.getData(); 
     Subscription subscription = observable 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<Shop>>() { 
        @Override 
        public void onCompleted() { 
         view.hideProgress(); 
        } 

        @Override 
        public void onError(Throwable e) { 
         super.onError(e); 
         view.hideProgress(); 
        } 

        @Override 
        public void onNext(List<Shop> shops) { 
         handleShops(shops); 
         view.onSuccess(); 
        } 
       }); 
     composite.add(subscription); 

In Datenschicht habe ich Interactor die Anforderung an den Server mit Retrofit macht und das Rück List<Shop>.

@Override 
public Observable<List<Shop>> getData() { 
    return api.getShops(pageNum).map(new Func1<ShopWrapper, List<Shop>>() { 
     @Override 
     public List<Shop> call(ShopWrapper wrapper) { 
      return wrapper.getShops(); 
     } 
    }); 
} 

Das Problem ist, dass ich mehrere identische Anfragen mit unterschiedlichen Seitenparameter, weil Server liefert N Geschäfte pro Seite, und ich brauche sammeln alle Geschäfte und ihn dann wieder Observable<List<Shop>> zu Vortragenden zu machen brauchen.

Ich bin neu in Reaktive Programmierung, vielleicht gibt es einen Operator, der dies ermöglicht.

Jede Hilfe wäre willkommen.

Antwort

2

Verwenden Sie einfach Observable.range und concatMap Ihre Anrufe damit. Wenn Sie Ihren oberen Bereich nicht kennen, können Sie takeUntil mit einigen Bedingungen verwenden.

Etwas wie folgt aus:

Wenn Sie nur einen wollen OnNext Sie nennen dies nach takeUntil hinzufügen:

.flatMapIterable(shops -> shops) 
.toList(); 
0

Sie können das mit Observable.concat Methode erreichen.

/** 
* Returns an Observable that emits the items emitted by two Observables, one after the other, without 
* interleaving them. 
*/ 

Observable<List<Shop>> observable = Observable.concat(
      interactor.getData(0), interactor.getData(1), interactor.getData(2) //and so on); 

Ihre getData Methode sollte pageNum Parameter akzeptieren:
public Observable<List<Shop>> getData(int pageNum)

Aber es ist nur eine Antwort für Ihre Frage, die Ihre Bedürfnisse nicht erfüllen konnte. Weil, wie ich sehe, könnte es unterschiedliche Anzahl von Seiten geben, aber concat ist nur für die statische Zählung von Observablen.

Sie können versuchen, das with building observable recursively zu lösen.

+0

Genau muss ich Art von rekursiven Anruf und Ergebnis in eine beobachtbare sammeln Liste, danke für den Link Ich werde es überprüfen. – Yarik

Verwandte Themen