Verhalten von onNext und onComplete

9

Ich habe ein Observable, das etwas tut, ohne einen Wert ausgeben zu müssen. Außerdem habe ich eine Liste von Objekten, mit denen das Observable arbeiten soll. Also für alle Elemente in dieser Liste: doSomething ()

%Vor%

Und die Methode, die das Observable erstellt:

%Vor%

Wenn ich das jetzt mit einer Liste mit 3 Elementen starte, bekomme ich:

%Vor%

was gut ist, weil das genau das ist, was ich wollte, aber ich weiß nicht, warum es funktioniert. Zuerst habe ich angefangen, OnComplete anzurufen, weil am Ende das Observable seine Arbeit erledigt und vervollständigt. Aber dann wird onNext natürlich nie auf den Abonnenten gerufen. Das Gleiche gilt für den umgekehrten Fall.

Meine Fragen sind also:

  1. Warum wird onComplete nur für das letzte Listenelement aufgerufen?
  2. Gibt es einen besseren Weg, dies zu lösen?
Kuno 23.07.2015, 10:52
quelle

3 Antworten

2

onComplete wird für das letzte Element aufgerufen, weil dann das früheste Observable in der Kette ( from(uris) ) beendet ist.

Es wird erwartet, dass Ihre Observablen, die von flatMap ausgegeben werden, onComplete aufrufen. Sobald das erledigt ist (und call zurückgegeben wurde), kann an der nächsten Emission von from gearbeitet werden. Sobald from die Ausgabe von Observablen beendet hat, ruft sie onComplete auf und die Kette ist effektiv beendet.

    
Adam S 23.07.2015, 13:44
quelle
4

Ich denke, dieser kleine Code hilft Ihnen, das Verhalten von onNext( ) und onComplete() zu verstehen.
Angenommen, Sie haben List<Uri> . Lassen Sie uns das in Observable<Uri> manuell umwandeln.

%Vor%

Oder Lambda-Ausdrücke verwenden:

%Vor%

Wie Sie sehen, wiederholen wir die Eingabeliste und rufen onNext( ) für jedes Element auf. Nachdem wir unsere List in Observable umgewandelt haben, haben wir onComplete()

aufgerufen

P.S. Dieser Code ist nur eine Demonstration, verwende ihn niemals , um List in Observable zu transformieren. Verwenden Sie dafür den Operator Observable.from() .

AKTUALISIEREN :

Operator from( ) Implementierung:

%Vor%

link: Ссылка

    
Alexander 23.07.2015 13:46
quelle
0

onComplete (wie onError ) wird nur einmal während der beobachtbaren Kette aufgerufen, es ist die Art, wie rxjava implementiert wird

Ich denke, dass Ihre Herangehensweise richtig ist, also wird kein besserer Weg gebraucht.

    
pjanecze 23.07.2015 10:59
quelle