RxJava 而不是 AsyncTask?

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

在我看来,RxJava提供了更多的功能,但与.AsyncTask

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


答案 1

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

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 在每个网络调用之后应该是隐式的 - 您可以通过修改创建改造客户端的方式来执行此操作。对于11 + 2行代码来说还不错,即使它比Android更像后端。.subscribeOn(Schedulers.io())


答案 2

Jake Wharton的RxBinding/RxAndroid提供了一些很好的线程功能,您可以使用这些功能进行异步调用,但RxJava提供了比处理异步线程更多的好处/功能。也就是说,有一个非常陡峭的学习曲线(IMO)。另外,应该注意的是,使用AsyncTasks没有错,你可以用Rx(也是IMO)编写更雄辩的解决方案。

TLDR 你应该努力使用它。Retrofit 和 RxJava 很好地协同工作,用于替换 AsyncTask。


推荐