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

  • Learning RxJava
  • Thomas Nield
  • 299字
  • 2021-07-02 22:22:54

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().

主站蜘蛛池模板: 西丰县| 杨浦区| 榕江县| 汤阴县| 禹城市| 通城县| 古蔺县| 西昌市| 江永县| 修水县| 新昌县| 交城县| 行唐县| 广东省| 友谊县| 金平| 沙田区| 汕头市| 阿拉善盟| 通许县| 昌图县| 郧西县| 呼图壁县| 武冈市| 交口县| 沅陵县| 石林| 龙州县| 邯郸县| 宁化县| 健康| 靖江市| 吉木萨尔县| 荔浦县| 荔浦县| 泸水县| 正蓝旗| 武功县| 石家庄市| 上思县| 夏河县|