2015-04-24 5 views
7

In ogni avvio di app, ho un Retrofit Observable che recupera il nome utente dell'utente da un server. Voglio usare questo valore per ogni abbonato successivo, ma sembra che ogni volta che chiamo subscribe(), il valore viene recuperato dalla rete. Dal momento che il nome utente non è suscettibile di modifiche durante il ciclo di vita dell'app, non sto ricreando l'oggetto Osservabile, solo istanziando una volta.RxJava: Come posso rendere visibile un recupero e una volta riutilizzato?

Come voglio che il lavoro è:

Creare osservabile una volta

recuperare il nome utente, una volta, salvo che il valore nel Observable

su Iscriviti, l'uso che ha salvato il valore, o se è non ha fatto il recupero, aspetta che venga recuperato

Come devo fare questo?

risposta

12

Per approfondire risposta corretta di David, ecco qualche codice che illustra l'uso di cache:

public class Caching { 
    public static void main(String[] args) throws IOException { 
     Observable<String> observable = doSomethingExpensive().cache(); 
     observable.subscribe(System.out::println); 
     observable.subscribe(System.out::println); 
    } 

    private static Observable<String> doSomethingExpensive(){ 
     return Observable.create(subscriber -> { 
      System.out.println("Doing something expensive"); 
      subscriber.onNext("A result"); 
      subscriber.onCompleted(); 
     }); 
    } 
} 

Si noti che, anche se si ottengono risultati due volte, si fa solo una volta qualcosa di costoso.

5

È possibile utilizzare cache() che recupererà il nome utente per il primo sottoscrittore e riprodurrà il valore su tutti gli abbonati in seguito (incluso il primo ovviamente).

+0

Con "use' cache() '", intendi quando crei l'Observable o quando ti iscrivi ad esso? –

+0

L'aggiunta di '.cache()' all'istanziazione dell'Osservabile sembra averlo fatto. Grazie! –

Problemi correlati