2015-04-24 22 views
7

Bei jedem App-Start habe ich eine Retrofit Observable, die den Benutzernamen des Benutzers von einem Server abruft. Ich möchte diesen Wert für jeden nachfolgenden Abonnenten verwenden, aber es scheint, dass jedes Mal, wenn ich subscribe() anrufe, der Wert aus dem Netzwerk erneut abgerufen wird. Da sich der Nutzername während des Lebenszyklus der App wahrscheinlich nicht ändert, erstelle ich das Observable-Objekt nicht erneut, sondern instanziiere es nur einmal. RxJava: Wie mache ich eine Observable Observable?

Wie ich es arbeiten will, ist:

die beobachtbaren Erstellen einmal

die Benutzername einmal holen, diesen Wert in den beobachtbaren

Auf abonnieren speichern, verwenden Sie den Wert gespeichert, oder wenn es nicht fertig holen, warten bis es geholt wird

Wie soll ich das machen?

Antwort

12

auf richtige Antwort Davids, zu erarbeiten hier einige Code, der die Verwendung von cache zeigt:

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(); 
     }); 
    } 
} 

Beachten Sie, dass, auch wenn Sie zweimal Ergebnisse zu erhalten, müssen Sie nur einmal etwas teuer machen.

5

Sie können cache() verwenden, die den Benutzernamen für den allerersten Abonnenten abruft und den Wert nur für alle Abonnenten wiedergibt (einschließlich der ersten natürlich).

+0

Mit "Cache'() '", meinen Sie, wenn Sie das Observable erstellen, oder wenn Sie es abonnieren? –

+0

Das Hinzufügen von '.cache()' zur Observablen Instanziierung scheint es getan zu haben. Vielen Dank! –

Verwandte Themen