rxJava 1:fromCallable和defer之间的区别是什么?

时间:2017-03-16 16:10:58

标签: java rx-java reactive-programming

deferdefer有不同的实施方式。我听到有人说private Observable<Integer> numbers(int start) { return Observable.just(start) .concatWith(Observable.defer(() -> numbers(start + 1))); } 有助于递归,但我无法生成任何显示它们之间差异的代码。

我试过无限数量的实现:

RecyclerView rvContacts = (RecyclerView) findViewById(R.id.exerciseList);

        exerciseBlocks = ExerciseBlock.createContactsList(20);
        ExerciseBlockAdapter adapter = new ExerciseBlockAdapter(this, exerciseBlocks);
        rvContacts.setAdapter(adapter);
        rvContacts.setLayoutManager(new LinearLayoutManager(this));

但订阅时仍然会出现堆栈溢出异常

2 个答案:

答案 0 :(得分:8)

fromCallable创建发出单个值的observable,然后完成。

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。无限数字流的代码会导致无限递归。可能需要使用调度程序来避免这种情况。

答案 1 :(得分:1)

我看的是 Single 的术语,它没有 Observable 复杂,因为它只能有 1 个值。 (即具有 1 个发射的可观察对象)。以下内容也适用于其他类型(Observable、Flowable、Completable)

Single.fromCallable

Single.fromCallable 实际上从它调用的函数内部的值创建了一个新的 Single 。这就是为什么 Aaron He 说的是评论:

<块引用>

fromCallable 是 Observable.defer(() -> Observable.just(value)) 的一种方便的方法

它通过使用 .just 来完成创建 Observable 的额外步骤。如果你调用一个已经创建了 Single 的函数 fromCallable,你会得到一个嵌套的 single。

// Not very useful to get a Single<Single<*>>
val fromCallable: Single<Single<String>> = Single.fromCallable {
    Single.just("Example")
}

// Better in these cases, where the function inside doesn't create a Single already:
 fun heavyFunction(): String { return "Heavy" }
val fromCallable2: Single<String> = Single.fromCallable {heavyFunction()}

Single.defer

Single.defer 调用里面的函数,如果它返回一个Single,那么你以后可以使用那个Single。如果没有,它将无法编译。

val defer: Single<String> = Single.defer {
    Single.just("Example")
}

// This line won't compile:
Single.defer {heavyFunction()}

// You need to wrap it in a Single:
val defer2: Single<String> = Single.defer {Single.just(heavyFunction())}

因此,Single.fromCallable 创建了一个 from callable,因此得名。这个不需要创建 Single 的可调用对象,它可以是任何东西。

Defer 不会创建 new Single,它只是调用它的主体,它应该创建一个 Single。这就是它的函数名称中没有 from 的原因。