RxJava 2.x中的Defer和fromCallable行为

时间:2018-07-03 10:50:14

标签: android rx-java rx-java2

在可观察的herehere上调用dispose()之后,我已经阅读了一些有关崩溃的RxJava2问题。然后,我尝试通过代码重现崩溃:

private String simulateHeavyWork() throws InterruptedException {
    Thread.sleep(2000);
    return "Done";
}
private void myFunc() {
    Disposable disposable = Observable.fromCallable(() -> simulateHeavyWork())
            .subscribeOn(Schedulers.io())
            .subscribe(System.out::println, throwable -> System.out.println(throwable.getMessage()));
   sleep(1000);
   disposable.dispose();

   sleep(60000);
}

运行代码时,我得到了预期的异常io.reactivex.exceptions.UndeliverableException。就像上面链接中的讨论一样,RxJava2不会吞噬Throwable,因此我们必须handle this。但是当我尝试使用defer而不是fromCallable来创建Observable时,令我惊讶的是,没有发生任何错误。

Disposable disposable = Observable.defer(() -> Observable.just(simulateHeavyWork()))

当我使用Flowable而不是Observable时,UndeliverableException又发生了。

Disposable disposable = Flowable.defer(() -> Flowable.just(simulateHeavyWork()))

因此,在这种情况下,我对deferfromCallableFlowableObservable之间的区别感到困惑。

0 个答案:

没有答案