2016-06-07 4 views
-1

RxJava를 사용하여 요청 목록을 연결하려고하지만 올바르게 수행하는 방법을 알 수 없습니다. 목록 (LIST_A)을 가지고 있으며, 반복하여 첫 번째 서비스 (SERVICE_A)로 데이터를 보내려고합니다. 답변을 얻 자마자 두 번째 웹 서비스 (SERVICE_B)에 새 목록 (LIST_B)을 보내야합니다. 흐름 : -> LOOP (LIST_A) SEND ITEM_A - 무엇을이다 END의 LOOPObservables, RxJava 및 Android를 사용하여 Webapi에 액세스하는 방법?

- >> 본 ITEM_A을 보낸 후 을 (그것은 두 번째 LOOP (LIST_B 시작) 및 모든 항목을 보낼 필요) 지금까지 수행 한 :

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}; (list_B의 B) {clientB.sendB}; 또는 for (list_a의 A) {clientA.sendA; for (list_B의 B) {clientB.sendB}; };'? –

+0

두 번째 옵션이지만 sendA가 응답을받은 후에 만 ​​sendB를 실행해야합니다. 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)))); 

는, 당신은 심지어 바로 인터페이스 방법이 Observable 인을 반환하기 위해선, fromCallable 전화가 필요하지 않습니다.