官术网_书友最值得收藏!

Observable.fromCallable()

If you need to perform a calculation or action and then emit it, you can use Observable.just() (or Single.just() or Maybe.just(), which we will learn about later). But sometimes, we want to do this in a lazy or deferred manner. Also, if that procedure throws an error, we want it to be emitted up the Observable chain through onError() rather than throw the error at that location in traditional Java fashion. For instance, if you try to wrap Observable.just() around an expression that divides  1 by 0, the exception will be thrown, not emitted up to Observer:

    import io.reactivex.Observable;
public class Launcher {
public static void main(String[] args) {

Observable.just(1 / 0)
.subscribe(i -> System.out.println("RECEIVED: " + i),
e -> System.out.println("Error Captured: " + e));
}
}

The output is as follows:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
at Launcher.main(Launcher.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.
invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.
application.AppMain.main(AppMain.java:147)

If we are going to be reactive in our error handling, this may not be desirable. Perhaps you would like the error to be emitted down the chain to the Observer where it will be handled. If that is the case, use Observable.fromCallable() instead, as it accepts a lambda Supplier<T> and it will emit any error that occurs down to Observer:

    import io.reactivex.Observable;

public class Launcher {
public static void main(String[] args) {

Observable.fromCallable(() -> 1 / 0)
.subscribe(i -> System.out.println("Received: " + i),
e -> System.out.println("Error Captured: " + e));
}
}

The output is as follows:

    Error Captured: java.lang.ArithmeticException: / by zero

That is better! The error was emitted to the Observer rather than being thrown where it occurred. If initializing your emission has a likelihood of throwing an error, you should use Observable.fromCallable() instead of Observable.just().

主站蜘蛛池模板: 仁寿县| 绥宁县| 伊金霍洛旗| 济宁市| 陆丰市| 营口市| 库车县| 福安市| 内江市| 祁阳县| 大荔县| 阿拉尔市| 梧州市| 新晃| 施甸县| 莆田市| 河津市| 汉沽区| 乌兰县| 郸城县| 宣化县| 澄城县| 新余市| 大连市| 天全县| 兴城市| 濉溪县| 左贡县| 镇远县| 望奎县| 汉川市| 宜宾县| 华池县| 翁牛特旗| 宕昌县| 迭部县| 浪卡子县| 彩票| 山西省| 正阳县| 东兰县|