2016-06-07 8 views
-1

Ich versuche RxJava zu verwenden, um eine Liste von Anfragen zu verketten, aber ich kann nicht herausfinden, wie man es richtig macht. Ich habe eine Liste (LIST_A), die ich durchlaufen und ihre Daten an den ersten Dienst (SERVICE_A) senden möchte. Sobald ich die Antwort bekomme, muss ich eine neue Liste (LIST_B) an einen zweiten Webservice (SERVICE_B) senden. Fluss: -> LOOP (LIST_A) SEND ITEM_A - >> nach dieser ITEM_A SENDING (braucht es die zweite LOOP (LIST_B) zu starten und alle Einzelteile senden) - END LOOPWie benutze ich Observables, RxJava und Android um auf ein Webapi zuzugreifen?

dass das, was ist ich habe bisher getan:

private static <T> Observable<T> makeObservable(final Callable<T> func) { 
    return Observable.create(
      new Observable.OnSubscribe<T>() { 
       @Override 
       public void call(Subscriber<? super T> subscriber) { 
        try { 
         subscriber.onNext(func.call()); 
        } catch(Exception ex) { 
         Log.e("OP_DAO", "Error reading from the database", ex); 
        } 
       } 
      }); 
} 

public Observable<List<VisitInfo>> getVisitObservable() { 
    return makeObservable(this.getVisit()) 
      .subscribeOn(Schedulers.computation()) ; 
} 

public Callable<List<VisitInfo>> getVisit() { 
    return new Callable<List<PesquisaInfo>>() { 
     @Override 
     public List<VisitInfo> call() throws Exception { 
      List<VisitInfo> list = new ArrayList<VisitInfo>(); 

      // 1. build the query 
      String query = "SELECT * FROM " 
        + VISIT ; 
      // 2. get reference to writable DB 

      try { 
       Cursor cursor = getMyWritableDatabase().rawQuery(query, null); 
       // 3. go over each row, build book and add it to list 
       if (cursor.moveToFirst()) { 
        do { 
         VisitInfo v = new VisitInfo(); 
         ... 
         list.add(v); 
        } while (cursor.moveToNext()); 
        closeCursor(cursor); 
       } 
       return list; 
      } finally { 
       closeDatabase(); 
      } 
     } 
    }; 

} 

Client client = new ServiceGenerator().createService(Client.class); 
Call<List<WS01>> wsServiceCall = client.GetData(user); 
Call<List<WS02>> wsService2Call = client.GetData2(dependent of first call); 

Jeder kann dabei helfen sie mir bitte, verbrachte ich ein paar Tage versuchen, zu verstehen, wie RxJava zu verwenden und Retrofit aber es ist härter als ich erwartet hatte.

+0

So ist es nicht klar, was Sie tun möchten; Welche der folgenden benötigen Sie? 'für (A in Liste_a) {clientA.sendA}; für (B in list_B) {clientB.sendB}; 'oder' für (A in list_a) {clientA.sendA; für (B in Liste_B) {clientB.sendB}; }; '? –

+0

Die zweite Option, aber es sendB muss erst ausgeführt werden, nachdem sendA die Antwort erhalten. Danke, dass du Tassos Bassoukos helfen willst, ich weiß das wirklich zu schätzen! –

Antwort

0

Nun, Sie müssen Ihr Problem besser beschreiben; benutze ein bisschen Pseudocode oder ein Sequenzdiagramm.

Ein Weg, was Sie wollen, ist in etwa wie folgt vorgehen:

import static Observable.*; 

public List<VisitInfo> getVisit() { /* just do the db things here */ } 

return defer(() -> from(getVisit())) 
     .flatMap(visit -> 
      fromCallable(client.getData(visit)) 
      .flatMapIterable(otherList -> otherList) 
      .flatMap(other -> fromCallable(client.getData2(visit, other)))); 

Wenn Sie Retrofit verwenden, dann brauchen Sie nicht einmal die fromCallable Anrufe, sondern nur die Interface-Methoden machen Observable zurückzukehren.