2017-01-04 4 views
1

Ich habe erwartet, dass flatMapCompletable die angegebene Aktion aufruft, wenn Completable normal beendet wird. Es funktioniert jedoch nicht wie ich dachte. Hier ist ein einfaches Beispiel:flatMapCompletable ruft die angegebene Aktion nicht auf

PublishProcessor<String> processor = PublishProcessor.create(); 

    processor.flatMapCompletable(s2 -> { 
     System.out.println("s2 " + s2); 
     return Completable.complete(); 
    }).subscribe(() -> { 
     System.out.println("done"); // it does not come here 
    }); 

Ist das erwartete Verhalten? Wenn ja, wie kann ich prüfen, ob die Compleable-Task abgeschlossen ist? Completable.complete().doFinally()?

Antwort

3

Sie müssen aufrufen, um Aktion onComplete zu erhalten. Dies liegt daran, dass Sie das Subjekt weiterhin abonniert haben, während es auf eingehende Ereignisse wartet.

Flowable schließt normalerweise

Flowable.just(1).flatMapCompletable(s2 -> { 
     System.out.println("s2 " + s2); 
     return Completable.complete(); 
    }).subscribe(() -> { 
     System.out.println("done"); // it does come here 
    }); 
+0

Vielen Dank für Ihre Antwort. Ich habe verstanden. Wenn ich PublishProcessor verwenden möchte, wird es vielleicht so sein? 'processor.flatMapCompletable (s1 -> { System.out.println ("s1" + s1); return Completable.complete() .doOnComplete (() -> processor.onComplete());} ) .subscribe (() -> System.out.println ("done") ); ' – tomoima525

2

Als Alexander wies darauf hin, der Grund, warum Sie nichts bekommen Sie ist PublishProcessor nie abgeschlossen.

JavaDoc von flatmapCompletable Hinweise wie folgt.

Ordnet jedes Element des Upstream-Observable in CompletableSources zu, abonniert sie und wartet, bis die Upstream- und alle CompletableSources abgeschlossen sind.

So müssen Sie sicherstellen, dass die Upstream Observable und alle CompletableSources abgeschlossen sind, um alle Ereignisse zu empfangen.

Danke.

Verwandte Themen