2017-03-16 106 views
1

fromCallabledefer有不同的实现。我听到有人说defer有助于递归,但我无法生成任何显示它们之间差异的代码。rxJava 1:fromCallable和defer之间有什么区别?

我试着用无限数量的实施:

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

但订阅

+0

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

+1

'fromCallable'对于'Observable.defer(() - > Observable.just(值))' –

回答

4

fromCallable创建观察到发射单个值,然后完成时我仍然得到堆栈溢出异常。

defer推迟创建实际可观察​​直到它被订阅。因此,您可以根据订阅时的状态创建多值。例如:

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

基本上可以达到同样的用fromCallable这样的:

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

PS。无限数字流的代码导致无限递归。可能需要使用调度程序来避免这种情况。

相关问题