2016-06-07 48 views
-1

我想使用RxJava來鏈接請求列表,但我無法弄清楚如何正確地做到這一點。 我有一個列表(LIST_A),我想迭代並將其數據發送到第一個服務(SERVICE_A)。只要我得到響應,我必須發送一個新列表(LIST_B)到第二個Web服務(SERVICE_B)。 流量: - > LOOP(LIST_A) SEND ITEM_A - >> 後發送此ITEM_A(它需要啓動第二環(LIST_B)和發送的所有項目) - END LOOP如何使用Observables,RxJava和Android來訪問Webapi?

那是什麼到目前爲止,我已經做了:

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

任何人都可以幫我請,我花了幾天試圖瞭解如何使用RxJava和改造,但它正在比我預料的要難。

+0

所以,目前還不清楚你想做什麼;你需要以下哪一項? (for list_a中的A){clientA.sendA}; for(B in list_B){clientB.sendB};'或'for(A in list_a){clientA.sendA; for(B in list_B){clientB.sendB}; };'? –

+0

第二個選項,但sendB只有在sendA收到答案後才需要執行。 謝謝你試圖幫助Tassos Bassoukos,我真的很感激! –

回答

0

那麼,你需要更好地描述你的問題;使用一些僞代碼或序列圖。

一種方式做你想要的東西大致如下:

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

如果您使用的改造,那麼你甚至都不需要fromCallable電話,才使接口方法返回觀測量。