2017-03-16 4 views
1

fromCallable und defer haben unterschiedliche Implementierung. Ich hörte einige sagen, dass defer hilft mit Rekursion, aber ich kann keinen Code, der den Unterschied zwischen ihnen zeigt, produzieren.rxJava 1: Was ist der Unterschied zwischen fromCallable und defer?

Ich habe versucht, mit unendlich vielen Umsetzung:

private Observable<Integer> numbers(int start) { 
     return Observable.just(start) 
       .concatWith(Observable.defer(() -> numbers(start + 1))); 
    } 

aber ich noch Stack-Überlauf Ausnahme erhalten, wenn

+0

https://artemzin.com/blog/rxjava-defer-execution-of-function-via-fromcallable/ –

+1

'fromCallable' ist eine bequeme Methode für' Observable.defer (() -> Observable.just (Wert)) ' –

Antwort

4

fromCallable abonnieren schafft beobachtbar, die einzelnen Wert abgibt, dann schließt.

defer verschiebt die Erstellung von tatsächlich beobachtbar, bis es abonniert ist. So können Sie multi-value beobachtbar basierend auf dem Stand zum Zeitpunkt des Abonnements erstellen. Zum Beispiel:

Observable<Integer> daysOfWeekLeft = 
    Observable.defer(() -> 
     Observable.range(currentDayOfWeek(), 7 - currentDayOfWeek())); 

Grundsätzlich kann man das gleiche mit fromCallable wie dies erreichen:

Observable<Integer> daysOfWeekLeft = 
    Observable.fromCallable(() -> currentDayOfWeek()) 
     .flatMap(day -> Observable.range(day, 7 - day)); 

PS. Ihr Code für unendlichen Strom von Zahlen führt zu unendlicher Rekursion. Möglicherweise müssen Sie mit den Schedulern spielen, um dies zu vermeiden.

Verwandte Themen