2015-04-24 5 views
7

Przy każdym uruchomieniu aplikacji mam funkcję Retrofit Observable, która pobiera nazwę użytkownika użytkownika z serwera. Chcę użyć tej wartości dla każdego kolejnego subskrybenta, ale wydaje się, że za każdym razem, gdy wywołuję funkcję subscribe(), wartość jest ponownie pobierana z sieci. Ponieważ nazwa użytkownika prawdopodobnie nie ulegnie zmianie podczas cyklu życia aplikacji, nie odtwarzam obiektu Observable, a tylko raz tworzę.RxJava: W jaki sposób można zaobserwować pobranie po użyciu i ponowne użycie?

Jak chcę go do pracy jest:

Tworzenie obserwowalnym raz

Pobiera nazwę użytkownika raz, zapisać tę wartość w obserwowalnym

Na subskrybować, wykorzystywania że zapisaną wartość, lub jeśli jest to nie wykonano pobierania, czekaj, aż zostanie pobrane:

Jak mam to zrobić?

Odpowiedz

12

Wypracowanie na prawidłową odpowiedź Dawida, oto niektóre kod, który ilustruje użycie 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(); 
     }); 
    } 
} 

zauważyć, że chociaż można uzyskać wyniki dwukrotnie, tylko zrobić coś drogiego raz.

5

Możesz użyć numeru cache(), który pobierze nazwę użytkownika dla pierwszego subskrybenta i odtworzy tę wartość dla wszystkich subskrybentów (włącznie z pierwszym).

+0

Przez "use' cache() '", masz na myśli tworzenie Observable lub subskrybowanie go? –

+0

Dodanie '.cache()' do instancji Observable zdało się to zrobić. Dzięki! –