2016-11-22 21 views
0

如何在RxJava中缝制两个Observable?RxJava缝制两个查询

Observable<List<CalendarEvent>>,对于每个CalendarEvent,我想通过网络操作来读取(lat,lon)和获取地点名称,然后将地名重新组合到CalendarEvent中。

public Observable<List<CalendarEvent>> getEvents() { 
    // get events 
    // translate each Event LatLng to Place and bind it to Event 
    // return the events 
} 

回答

0

无需在这里看中的东西,这大概会做你想要什么,我认为:

public class Foobar { 

    void doSomethingWithEvents() { 

     getEvents().subscribe(new Action1<List<CalendarEvent>>() { 
      @Override 
      public void call(List<CalendarEvent> calendarEvents) { 

       for (CalendarEvent event : calendarEvents) { 

        getPlaceForEvent(event).subscribe(new Action1<Place>() { 
         @Override 
         public void call(Place place) { 

          event.setPlace(place); 

         } 
        }); 

       } 

      } 
     }); 
    } 

    Observable<Place> getPlaceForEvent(CalendarEvent event) { 
     return Observable.just(new Place()); 
    } 


    Observable<List<CalendarEvent>> getEvents() { 

     return Observable.just(new ArrayList<CalendarEvent>()); 

    } 


} 
+0

感谢寻找,但是,无效doSomethingWithEvents()应返回**可观察到<列表> **,因为我在演示者(MVP)中使用它。 – purplebee

1
public Observable<List<CalendarEvent>> getEvents() { 
    List<CalendarEvent> sourceList = ... 
    return Observable.from(sourceList) //emits each item separately 
      .concatMap(calendarEvent -> applyPlaceName(calendarEvent)) //fetches places and applies them for each item 
      //fyi: concatMap executes requests sequentially, if you want do it in parallel - use flatMap instead 
      .toList(); //collects items to list 
} 

//somewhere in your Networking class 
public Observable<CalendarEvent> applyPlaceName(CalendarEvent calendarEvent) { 
    return Observable ... //do network call and apply placeName on item 
} 

//p.s. don't forget to apply appropriate Schedulers