2016-07-02 6 views
-1

У меня есть два списка - у каждого списка есть API и для каждого элемента, который я должен назвать API (с помощью retrofit2 - android).Дождитесь завершения двух наблюдаемых окон

Могу ли я сделать что-то вроде этого?

Как я могу подписаться на их оба конца?

Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages()); 
    Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages()); 

    offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() { 
     @Override 
     public Observable<RestOfferImage> call(Integer integer) { 
      return backendService.getDatabaseOfferImage(integer); 
     } 
    }).subscribe(new Action1<RestOfferImage>() { 
     @Override 
     public void call(RestOfferImage restOfferImage) { 
      offerService.saveOfferImage(restOfferImage); 
     } 
    }); 

    otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() { 
     @Override 
     public Observable<RestOtherOfferImage> call(Integer integer) { 
      return backendService.getDatabaseOtherOfferImage(integer); 
     } 
    }).subscribe(new Action1<RestOtherOfferImage>() { 
     @Override 
     public void call(RestOtherOfferImage restOtherOfferImage) { 
      otherOfferService.saveOtherOfferImage(restOtherOfferImage); 
     } 
    }); 

- UPDATE:

Я попытался переписать его, как это. Проблема заключается в том, что я вижу только первый flatMap Func1 выполнен - ​​для первой записи ...

Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages()); 
Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages()); 

Observable ob1 = offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() { 
    @Override 
    public Observable<RestOfferImage> call(Integer integer) { 
     return backendService.getDatabaseOfferImage(integer); 
    } 
}).map(new Func1<RestOfferImage, Void>() { 
    @Override 
    public Void call(RestOfferImage restOfferImage) { 
     offerService.saveOfferImage(restOfferImage); 
     return null; 
    } 
}); 

Observable ob2 = otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() { 
    @Override 
    public Observable<RestOtherOfferImage> call(Integer integer) { 
     return backendService.getDatabaseOtherOfferImage(integer); 
    } 
}).map(new Func1<RestOtherOfferImage, Void>() { 
    @Override 
    public Void call(RestOtherOfferImage restOtherOfferImage) { 
     otherOfferService.saveOtherOfferImage(restOtherOfferImage); 
     return null; 
    } 
}); 

ob1.zipWith(ob2, new Func2() { 
    @Override 
    public Object call(Object o, Object o2) { 
     return null; 
    } 
}).subscribe(new Subscriber() { 
    @Override 
    public void onCompleted() { 
     Log.d("AllDone", "DA"); 
     onLoadingFinishedListenerCallback.onLoading2Finished(); 
    } 

    @Override 
    public void onError(Throwable e) { 

    } 

    @Override 
    public void onNext(Object o) { 

    } 
}); 
+0

Ваша вторая версия выглядит нормально более или менее. Если вы не видите 2-ю плоскую карту, она, вероятно, означает, что наблюдаемый возвращаемый из restDatabaseImages.getOtherOfferImages() никогда не испускает элемент. Также вы можете вставить выход. – yurgis

+0

@yurgis, извините, я имел в виду, что 2nd flatMap не вызывается, но и 1-я карта не называется. Я поставил Log.d(), поэтому я уверен. – fritz

+0

Пожалуйста, исправьте свой вопрос. – yurgis

ответ

2

Я думаю, что вы ищете что-то вроде этого:

public class SimpleTest { 

    @Test 
    public void testSample() { 
     Integer[] offerImages = {1, 2, 3, 4, 5}; 
     Integer[] otherOfferImages = {6, 7, 8, 9, 10}; 

     Observable<Integer> offerObservable = Observable.from(offerImages).flatMap(someInt -> fakeApiCall(someInt)); 
     Observable<Integer> otherOfferObservable = Observable.from(otherOfferImages).flatMap(someInt -> fakeApiCall(someInt)); 

     Observable.zip(
       offerObservable, 
       otherOfferObservable, 
       (offer, otherOffer) -> String.format("Offer: %d - Other Offer: %d", offer, otherOffer) 
     ).subscribe(data -> System.out.println(data)); 
    } 

    private Observable<? extends Integer> fakeApiCall(Integer someInt) { 
     return Observable.just(someInt * 10); 
    } 
} 

Zip оператор гарантирует, что вы испускать эти события вместе, а затем вы можете создать с ними новый поток.

Код выше напечатает это:

Offer: 10 - Other Offer: 60 
Offer: 20 - Other Offer: 70 
Offer: 30 - Other Offer: 80 
Offer: 40 - Other Offer: 90 
Offer: 50 - Other Offer: 100 
+1

Спасибо! Что делать, если OfferImages или otherOfferImages пуст? Я хотел бы выполнить «subscribe (data -> System.out.println (data)». – fritz