Was Sie hier eigentlich erreichen möchten, ist eine asynchrone Aufgabe zu übernehmen und in eine synchrone umzuwandeln.
Es gibt mehrere Möglichkeiten, es zu erreichen, jeder mit seinen Vor-und Nachteile:
- Verwendung toBlocking() - es bedeutet, dass dieser Thread blockiert wird, bis der Strom Finish ist, um nur eins zu bekommen verwenden Sie einfach first(), da es abgeschlossen wird, sobald ein Artikel geliefert wird. Ihr gesamte Strom ist
Observable<T> getData();
dann ein Verfahren sagen lassen, die unmittelbar auf den letzten Wert erhalten werden wie folgt aussehen:
public T getLastItem(){ return getData().toBlocking().first(); }
benutzen Sie bitte nicht last(), wie es für den Stream warten abzuschließen und nur dann wird das letzte Element emittieren.
Wenn es sich bei Ihrem Stream um eine Netzwerkanforderung handelt und noch kein Element gefunden wurde, wird Ihr Thread blockiert! Verwenden Sie ihn also nur, wenn Sie sicher sind, dass ein Element sofort verfügbar ist (oder wenn Sie wirklich eine Blockierung wünschen) ...)
eine weitere Option ist es, einfach das letzte Ergebnis zwischenspeichern, so etwas wie folgt aus:.
getData() abonnieren (t-> cachedT = t;) // irgendwo im Code und es speichert den zuletzt gelieferten Artikel weiter public T getLastItem() { return cachedT; }
wenn gab es keine Einzelteil durch die Zeit, die Sie anfordern gesendet werden Sie null erhalten oder was auch immer Anfangswert Sie eingestellt haben. Das Problem mit diesem Ansatz ist, dass die Subscribe-Phase nach dem Holen passieren könnte und eine Race-Bedingung machen könnte, wenn sie in 2 verschiedenen Threads verwendet wird.
Worüber sprechen Sie? Was meinst du zuletzt? – akarnokd
'myObservable' ist eine heiße Observable, die zB in unregelmäßigen Abständen" 1 "," 2 "," 3 "ausgibt. Was ich tun möchte, ist in der Lage zu sein, "MyObservable" neuesten Wert ("3" in unserem Fall) zu der Zeit, die ich erreichen die Return-Anweisung –
Ist meinObservable heiß oder kalt? –