RxJava而不是AsyncTask?

时间:2016-08-29 19:49:25

标签: java android concurrency android-asynctask rx-java

当人们试图说服我使用RxJava而不是Android的标准AsyncTask构造时,我遇到了几个实例。

在我看来,RxJava提供了更多功能,但与AsyncTask的简单性有关。

是否有任何用例比其他用途更适合一种方法,甚至更普遍的RxJava甚至可以被认为是优越的?

2 个答案:

答案 0 :(得分:15)

当您在Java 8上使用它时,可以看到RxJava的全部功能,最好使用像Retrofit这样的库。它允许您轻松地将操作链接在一起,完全控制错误处理。例如,考虑给出id的以下代码:指定订单和apiClient的int:订单管理微服务的Retrofit客户端:

apiClient
.getOrder(id)
.subscribeOn(Schedulers.io())
.flatMapIterable(Order::getLineItems)
.flatMap(lineItem ->
    apiClient.getProduct(lineItem.getProductId())
             .subscribeOn(Schedulers.io())
             .map(product -> product.getCurrentPrice() * lineItem.getCount()),
    5)
.reduce((a,b)->a+b)
.retryWhen((e, count) -> count<2 && (e instanceof RetrofitError))
.onErrorReturn(e -> -1)
.subscribe(System.out::println);

这将异步计算订单的总价,具有以下属性:

  • 在任何时候最多有5个针对API的请求(并且您可以调整IO调度程序以对所有请求设置硬限制,而不仅仅针对单个可观察链)
  • 网络错误时最多重试2次
  • -1如果失败(反模式TBH,但这是另一个讨论)

此外,每次网络调用后IMO .subscribeOn(Schedulers.io())都应该是隐式的 - 您可以通过修改创建Retrofit客户端的方式来实现。对于11 + 2行代码来说也不错,即使它比Android-ish更具后端性。

答案 1 :(得分:3)

Jake Wharton的RxBinding / RxAndroid提供了一些很好的线程功能,可用于进行异步调用,但RxJava提供了更多的好处/功能,而不仅仅是处理异步线程。也就是说,有一个非常陡峭的学习曲线(IMO)。此外,应该注意使用AsyncTasks没有任何问题,你可以用Rx(也是IMO)编写更多有说服力的解决方案。

TLDR你应该努力使用它。 Retrofit和RxJava可以很好地协同处理AsyncTask。