6

Ho un osservabile, che avvolge una richiesta HTTPCome aggiornare osservabile in RxJava?

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

poi abbonamento

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

Quando l'inizializzazione viene sottoscrizione, freddo osservabile sia attivata e richiesta HTTP incendi. Ora, so che i dati sottostanti sono cambiati, e ho bisogno di fare lo stesso, ma una nuova richiesta. Ho provato

mSubscription.unsubscribe(); 

quindi chiamando

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

ancora una volta, come dalla mia comprensione, la sottoscrizione dovrebbe attivare l'osservabile, ma doesnt lavoro. Qualche suggerimento?

risposta

9

Una volta completato il numero Observable, non viene pubblicato alcun nuovo elemento. È un contratto Rx.

Avvolgi il tuo codice in un metodo e crea ogni volta un nuovo osservabile.

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


Come @DaveSexton menzionato nel commento c'è anche approccio migliore usando defer funzione nel RxJava

Non creare osservabile fino a quando un abbonato sottoscrive; creare una nuova osservabile su ogni abbonamento

Passo rinviare () una funzione di fabbrica osservabili (una funzione che genera Osservabili), e rimandare() restituirà un osservabili che chiamerà questa funzione per generare la sequenza di Osservabile capo ogni volta che un nuovo Sottoscrittore sottoscrive.

Maggiori informazioni qui: https://github.com/ReactiveX/RxJava/wiki/Creating-Observables#defer

+0

In RxNet abbiamo un metodo factory per questo: [Rinvia] (http://msdn.microsoft.com/en-us/library/hh229160 (v = vs.103) aspx). Suppongo che RxJava abbia un metodo simile. –

+0

@DaveSexton Ottimo punto, ho intenzione di aggiungere un collegamento a RxJava rinviare la documentazione. Non ne ho mai sentito parlare prima, grazie. – tomrozb

Problemi correlati