2016-08-29 148 views
5

我遇到过几个人试图说服我使用RxJava而不是Android的标准AsyncTask构造的例子。RxJava而不是AsyncTask?

在我看来RxJava提供了更多的功能,但在打击AsyncTask简单丢失。

是否有适合的一种方法比其他或更一般都能RxJava甚至被认为优于任何更好的使用情况?

+2

我看到这篇文章解释了为什么,如果有帮助。 http://blog.feedpresso.com/2016/01/25/why-you-should-use-rxjava-in-android-a-short-introduction-to-rxjava.html – lsiva

+0

谢谢。它看起来有点像Scala处理并发。我会在我的项目中进行一些测试以适应RxJava。但是,你认为AsyncTask的功能有一个基本缺陷吗? – qantik

回答

10

当您在Java 8上使用RxJava时,可以看到RxJava的全部功能,最好使用像Retrofit这样的库。它可以让您轻松地将操作链接在一起,完全控制错误处理。例如,考虑给定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); 

这将异步计算的顺序的总价格,具有以下属性:用于订单管理微服务一个改造客户端:指定的顺序和apiClient一个int :

  • 在任一个时刻对API最多5个请求在飞行(和你可以调整IO调度程序对所有请求硬工资帽,而不仅仅是一个单一可观察链)
  • 达如果发生网络错误,请重试2次
  • -1失败的情况下(一个反TBH,但是这是一个其他的讨论)

此外,海事组织.subscribeOn(Schedulers.io())后,每个网络电话应该是隐含的 - 你可以通过修改你如何创建改造客户。对于11 + 2行代码来说不错,即使它比Android-ish更后端。

+0

非常感谢这个详细的例子。我期待对这些一流的功能进行修补。在Java中很久没有这样做了。 – qantik

3

RxBinding/RxAndroid由杰克沃顿商学院提供了您可以使用,使异步调用一些不错的线程功能,但RxJava提供的不仅仅是处理异步线程waaay更多的好处/功能。这就是说,有一个非常陡峭的学习曲线(IMO)。另外,应该注意的是,使用AsyncTasks没有任何问题,您可以使用Rx(也是IMO)编写更多雄辩的解决方案。

TLDR你应该努力使用它。 Retrofit和RxJava可以很好地协同工作,以实现AsyncTask的替换目的。

+0

很酷。那么你会说AsyncTask对于像一个简单的HTTP处理程序这样的小型项目来说可以吗? – qantik

+0

当然,但你可以用RxJava/RxBinding/RxAndroid完成同样的事情,你可以通过这种方式获得一些很酷的点。 –

+0

非常好。我一直在寻找优雅。 ;-) – qantik