defer
和defer
有不同的实施方式。我听到有人说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));
但订阅时仍然会出现堆栈溢出异常
答案 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
的原因。