2016-08-16 13 views
6

Czy jest jakiś sposób na osiągnięcie następujących:RXJava - uruchomienie wielu obserwable po drugim (jak concat, ale z onCompleted dla każdego obserwowalne)

mam 3 obserwable typu Observable<MyData>. Co chcę jest następująca:

  • prowadzony pierwszego zaobserwowania
  • obserwować onCompleted pierwszego zaobserwowania
  • prowadzony drugi obserwowalne
  • obserwować onCompleted drugiego obserwowalnym
  • prowadzony trzeci obserwowalne
  • obserwować onCompleted trzeciej obserwowalne

Można to zrobić za pomocą concat, ale wtedy będę mógł obserwować tylko ostatnie onCompleted.

rozwiązanie brzydki

wiem, czy mogę to osiągnąć, jeśli tylko zacząć następną obersvable z imprezy onCompleted byłego jeden.

Pytanie

Czy jest jakiś inny sposób na osiągnięcie tego jeszcze z dowolnej liczby obserwabli? Chcę uniknąć łączenia to wszystko razem z imprezy onCompleted, jak to wygląda naprawdę brzydki i głębsze łańcuchowym idzie mniej jasne robi ...

Edycja - USECASE

  • Po pierwsze, chcę emitować dane, które reprezentują dane, które moja aplikacja załadowała przy ostatnim uruchomieniu (serializuję dane na dysku) => powodem jest, chcę bardzo szybki start aplikacji cały czas
  • Następnie chcę drugi przebieg ładowania danych, w celu załadowania aktualnych danych w pustym stanie
  • następnie chcę trzeci ładowanie danych załadować brakujące głębsze dane z aktualnych danych

Chcę stale aktualizować interfejs użytkownika i chcę wiedzieć, kiedy każdy poziom ładowania danych ma zakończone

+0

Co dokładnie próbujesz zrobić, obserwując wiele zdarzeń 'onCompleted'? Czy możesz podać tutaj przykładowy przypadek użycia? –

+0

Edytowałem moje pytanie z moim przypadkiem użycia ... – prom85

+1

Hej, czy masz rozwiązanie? –

Odpowiedz

0

Myślę, że odpowiedź brzmi: concatMap. Z concatMap można złączyć obserwable i zapisz raz, więc jesteś kod może być coś takiego:

Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
    .concatMap(integer -> Observable.just(integer) 
      .observeOn(Schedulers.computation()) 
      .concatMap(i -> { 
       try { 
        Thread.sleep(new Random().nextInt(1000)); 
        return Observable.just(2 * i); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
        return Observable.error(e); 
       } 
      })) 
    .subscribe(System.out::println, 
      Throwable::printStackTrace, 
      () -> System.out.println("onCompleted")); 
9

Mam nadzieję, że poniższy kod pomaga.

Observable<MyData> observable1 = ...; 
Observable<MyData> observable2 = ...; 
Observable<MyData> observable3 = ...; 

Observable 
     .concat(observable1.doOnCompleted(this::onCompleteObservable1), 
       observable2.doOnCompleted(this::onCompleteObservable2), 
       observable3.doOnCompleted(this::onCompleteObservable3)) 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(...); 

Oto przykładowe metody.

void onCompleteObservable1() { 
    //do some work 
} 

void onCompleteObservable2() { 
    //do some work 
} 

void onCompleteObservable3() { 
    //do some work 
} 
Powiązane problemy