我是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的角度来看,我可以就这是否真的是一个问题提出一些建议。
答案 0 :(得分:1)
create
主要是为了将异步源与反应世界联系起来,但是你的代码似乎只是为了发出信号而发出信号。为此,fromCallable
更合适,并且更好地向读者传达意图:
Single<ShippingMethodResponse> productOneResponseEntity =
Single.<ShippingMethodResponse>fromCallable(() ->
getProductOneowShippingMethodResponse(shippingContext)
)
.subscribeOn(Schedulers.io());
根据您的应用程序类型,可能不希望阻塞等待结果,特别是如果从UI线程调用该方法。您可以返回压缩的Single
并继续撰写,直到可以发布最终subscribe()
。
关于此代码的评论来自人们更多地了解这一点,本质上说这是缺少RxJava异常处理&#34;并且会导致流阻塞或崩溃&#34;
原始create
和fromCallable
会捕获您的例外,并会尝试向消费者发出信号。在这种情况下,blockingGet
将重新抛出调用程序线程上的一个源异常,而另一个(如果有)将路由到全局RxJavaPlugins.onError
处理程序。它们可能意味着您的方法的调用者通常不会指望它抛出,因此它们可能会忽略它周围的try-catch并在运行时失败。解决它实际上取决于您在应用程序中的预期类型或错误管理。