2017-08-14 3 views
6

Ich habe folgendes RxJava2 Kotlin Code:RxJava Completabe andthen Test

val tester = Completable.complete() 
      .andThen(SingleSource<Int> { Single.just(42) }) 
      .test()   
tester.assertComplete() 
tester.assertValue(42) 

Dies simuliert eine komplettierbar beobachtbaren mit (man stelle sich eine einfache Update-Vorgang zu einer API) und dann ein Einzel beobachtbar (Bild eine get-Operation auf ein API). Ich möchte die beiden Observablen so verketten, dass, wenn die Completable beendet ist, der Single läuft und ich schließlich das onSuccess-Event auf meinem Beobachter (Int 42) erhalte.

Dieser Testcode funktioniert jedoch nicht. Die Behauptung, schlägt mit dem folgenden Fehler:

java.lang.AssertionError: Not completed 
(latch = 1, values = 0, errors = 0, completions = 0)) 

Ich bin nicht in der Lage zu verstehen, was ich falsch mache, erwarte ich, dass die komplettierbar onComplete auf Abonnement emittiert, und dann wird die Einzel abonniert, und mein Beobachter (tester) bekommt ein onSuccess-Ereignis mit dem Wert 42, scheint aber, dass das Abonnement "ausgesetzt" bleibt und nichts ausgibt.

Die Idee ist ähnlich der in diesem Blog-Eintrag gefunden: https://android.jlelse.eu/making-your-rxjava-intentions-clearer-with-single-and-completable-f064d98d53a8

apiClient.updateMyData(myUpdatedData) // a Completable 
    .andThen(performOtherOperation()) // a Single<OtherResult> 
    .subscribe(otherResult -> { 
     // handle otherResult 
    }, throwable -> { 
     // handle error 
    }); 

Antwort

8

Das Problem ist Kotlin mit seinen zweideutigen Verwendung von geschweiften Klammern:

.andThen(SingleSource<Int> { Single.just(42) }) 

Sie eine SingleSource schaffen, tut Hinweis auf seine SingleObserver, aber das ist durch die Kotlin-Syntax verborgen. Was Sie brauchen, ist klar Gebrauch:

.andThen(Single.just(42)) 

oder latente Verwendung

.andThen(Single.defer { Single.just(42) }) 
+0

Dank akarnokd, ich aus irgendeinem Grund, dass, weil zunächst zum Code hinzugefügt ich tat '.andThen {Single.just (42) } 'was nicht kompiliert wurde. – Miquel