6

Mam obserwowalne, który owija żądanie HTTPJak odświeżyć obserwowalne w RxJava?

mObservable = retryObservable(mService.getAddressList(getUserId(), true, 1, Integer.MAX_VALUE, "id", true) 
      .map(r -> { 
       return r.getItems(); 
      }) 
      .observeOn(AndroidSchedulers.mainThread())); 

następnie Subskrypcja

mSubscription = mObservable.subscribe(items -> { 
       mAddressAdapter.swapItems(items); 
      }, getActivityBase()::showError); 

Po inicjalizacji subskrypcji przychodzi zimno obserwowalne jest aktywna i żądanie HTTP pożary. Teraz wiem, że podstawowe dane uległy zmianie i muszę zrobić to samo, ale nowe żądanie. Próbowałem

mSubscription.unsubscribe(); 

następnie wywołanie

mObservable.subscribe(items -> {doSomething();}) 

znowu, jak z mojego zrozumienia, subskrybowania powinna wyzwalać obserwowalny, ale nie robi praca. Jakieś sugestie?

Odpowiedz

9

Po zakończeniu Observable nie publikuje żadnych nowych pozycji. To umowa Rx.

Zawiń kod w metodę i utwórz nowy obserwowalny za każdym razem.

Observable<?> getObservable() { 
    return retryObservable(mService.getAddressList(getUserId(), true, 1, Integer.MAX_VALUE, "id", true) 
      .map(r -> { 
       return r.getItems(); 
      }) 
      .observeOn(AndroidSchedulers.mainThread())); 
} 


Jak @DaveSexton wspomniano w komentarzu jest nawet lepsze podejście przy użyciu defer funkcję w RxJava

Nie twórz obserwowalnym aż Abonent podpisuje; tworzyć świeżego dostrzegalne na każdej subskrypcji

pass defer() zauważalny funkcji fabrycznych (funkcją generuje wykrywalności) oraz przesunięcie() powróci do zaobserwowania że wywoła funkcję wygenerować jego obserwowalnych sekwencję ponownie za każdym razem, gdy subskrybent zasubskrybuje nowy subskrybent.

Więcej tutaj: https://github.com/ReactiveX/RxJava/wiki/Creating-Observables#defer

+0

W RxNet mamy metodę fabryczną dla tego: [odroczyć] (http://msdn.microsoft.com/en-us/library/hh229160 (v = vs.103) .aspx). Zakładam, że RxJava ma podobną metodę. –

+0

@DaveSexton Bardzo dobry punkt, mam zamiar dodać link do dokumentacji odroczenia RxJava. Nigdy o tym nie słyszałem, dzięki. – tomrozb