2017-08-14 35 views
6

Mam następujący kod RxJava2 Kotlin:RxJava Completabe andthen testowanie

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

Symuluje mający Completable obserwowalne (wyobrazić sobie prostą obsługę aktualizacji do API), a następnie pojedyncze obserwowalne (obraz operacji get na zasadzie API). Chcę połączyć obydwa obserwowalne w taki sposób, że gdy kończy się Completable, Single działa, a na końcu dostaję zdarzenie onSukces na moim obserwatorze (Int 42).

Jednak ten kod testowy nie działa. Twierdzenie nie powiedzie się z powodu następującego błędu:

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

ja nie jestem w stanie zrozumieć, co robię źle, spodziewam się, że Completable emituje onComplete na abonament, a potem panna subskrybuje, a mój obserwator (tester) dostaje zdarzenie onSuccess o wartości 42, ale wydaje się, że subskrypcja pozostaje "zawieszona", nie emitując niczego.

Pomysł jest podobny do tego znalezionego w tym blogu: 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 
    }); 

Odpowiedz

8

Problem polega Kotlin z jego niejednoznacznej użycia nawiasów klamrowych:

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

utworzeniu SingleSource że robi zwracając uwagę na jego SingleObserver, ale to jest ukryte w składni Kotlina. Co trzeba to zwykły zastosowanie:

.andThen(Single.just(42)) 

lub odroczony użycie

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

Dzięki akarnokd jakiegoś powodu dodałem, że do kodu, ponieważ początkowo robiłem '.andThen {Single.just (42) } 'który nie kompilował. – Miquel