2014-07-12 3 views
2

그래서 나는 전혀 해결할 수없는 상황이 있습니다.여러 구독을 결합한 RXJava

두 개의 네트워크 요청을 병렬로 실행 한 다음 각 네트워크 요청이 끝날 때 일부 코드를 실행하고 각 네트워크 요청 처리가 끝날 때 추가로 실행하려는 상황이 있습니다.

내가 Observable.merge을하려고 했어요이

GET -> /users (run unique code to this request independently once the request is done) 
GET -> /groups (run some unique code to this request independently once the request is done) 
Both requests are done, now run some unique code independent of the request processing. 

같은 모델로하지만 나 하나의 거대한 핸들러에서 별도의 가입 코드를 유지하는 것을 허용하지 않으므로 즉, 희망이 보인다. 누구 제안이 있습니까?

답변

8


옵션 중 하나는지도를 사용하여 각 응답에서 추가 작업을 수행 한 다음 결과를 결합하도록 압축하는 것입니다. 예 :

//this emulates the first network call 
    Observable<List<String>> o1 = Observable.just(Arrays.asList("user1", "user2")); 
    //when the data arrives, you may transform it 
    Observable<List<String>> m1 = o1.map(new Func1<List<String>, List<String>>() { 
     @Override 
     public List<String> call(List<String> users) { 
      return users; 
     } 
    }); 

    //and the same for the second network call 
    Observable<List<String>> o2 = Observable.just(Arrays.asList("group1", "group2")); 
    Observable<List<String>> m2 = o2.map(new Func1<List<String>, List<String>>() { 
     @Override 
     public List<String> call(List<String> groups) { 
      return groups; 
     } 
    }); 

    //when both network calls succeed you can merge results using zip method  
    Observable<Map<String, List<String>>> result = Observable.zip(m1, m2, new Func2<List<String>, List<String>, Map<String, List<String>>>() { 
     @Override 
     public Map<String, List<String>> call(List<String> users, List<String> groups) { 
      Map<String, List<String>> result = new HashMap<String, List<String>>(); 
      for(String user: users){ 
       result.put(user, groups); 
      } 
      return result; 
     } 
    }); 
    /// now you can return the result 


    /// finally you have to subscibe to get the results, e.g: 
    result.subscribe(new Action1<Map<String, List<String>>>() { 
     @Override 
     public void call(Map<String, List<String>> stringListMap) { 
      for(String user: stringListMap.keySet()){ 
       System.out.println("User :"+user+", groups :"+stringListMap.get(user)); 
      } 
     } 
    }); 
+0

좋은 해결책입니다. 기본적으로 RXJava 그룹에서 발견 된 zip을 사용해야합니다. – adrian

관련 문제