我真的需要在这个简单的RxJava异步场景中进行异常处理吗?

时间:2018-05-22 16:28:50

标签: java rx-java

我是RxJava的新手,虽然我熟悉流和Javascript承诺。我正在使用一些使用RxJava的现有代码,以及一些人对该代码所做的一些评论。我想获得更多关于此的背景知识,同时我继续吸收文档。

有问题的是这个(有些名字改了):

public ShippingMethodHolder callClientsAsync(ShippingMethodContext shippingContext) {
    Single<ShippingMethodResponse> productOneResponseEntity = Single.<ShippingMethodResponse>create(source -> {
        source.onSuccess(getProductOneowShippingMethodResponse(shippingContext));
    }).subscribeOn(Schedulers.io());

    Single<ShippingMethodResponse> productTwoResponseEntity = Single.<ShippingMethodResponse>create(source -> {
        source.onSuccess(getProductTwoShippingMethodResponse(shippingContext));
    }).subscribeOn(Schedulers.io());

    Single<ShippingMethodHolder> singleProductCartResponseHolder = Single.zip(productOneResponseEntity, productTwoResponseEntity,
            (dtvResponse, productTwoResponse) -> {
                return new ShippingMethodHolder(dtvResponse, productTwoResponse);
            });
    return singleProductCartResponseHolder.blockingGet();
}

关于此代码的评论来自人们更多地了解这一点,本质上说这是缺少RxJava异常处理“并将导致阻塞或崩溃流”。我想这是指两个异步调用都有“onSuccess()”调用,但没有“onError()”调用。

然而,这对我来说似乎很奇怪。调用“onSuccess()”的范围不是用于业务逻辑成功或失败,而是看似RxJava尝试进行异步调用。

从RxJava的角度来看,我可以就这是否真的是一个问题提出一些建议。

1 个答案:

答案 0 :(得分:1)

create主要是为了将异步源与反应世界联系起来,但是你的代码似乎只是为了发出信号而发出信号。为此,fromCallable更合适,并且更好地向读者传达意图:

Single<ShippingMethodResponse> productOneResponseEntity = 
    Single.<ShippingMethodResponse>fromCallable(() -> 
        getProductOneowShippingMethodResponse(shippingContext)
    )
    .subscribeOn(Schedulers.io());

根据您的应用程序类型,可能不希望阻塞等待结果,特别是如果从UI线程调用该方法。您可以返回压缩的Single并继续撰写,直到可以发布最终subscribe()

  

关于此代码的评论来自人们更多地了解这一点,本质上说这是缺少RxJava异常处理&#34;并且会导致流阻塞或崩溃&#34;

原始createfromCallable会捕获您的例外,并会尝试向消费者发出信号。在这种情况下,blockingGet将重新抛出调用程序线程上的一个源异常,而另一个(如果有)将路由到全局RxJavaPlugins.onError处理程序。它们可能意味着您的方法的调用者通常不会指望它抛出,因此它们可能会忽略它周围的try-catch并在运行时失败。解决它实际上取决于您在应用程序中的预期类型或错误管理。