当人们试图说服我使用RxJava而不是Android的标准AsyncTask
构造时,我遇到了几个例子。
在我看来,RxJava提供了更多的功能,但在简单性方面不如AsyncTask
。
是否有任何用例比另一种方法更适合一种方法,甚至更通用,RxJava甚至可以被认为是优越的?
当您在Java8上使用RxJava时,可以看到它的全部功能,最好是使用像Retrofit这样的库。它允许您轻松地将操作链接在一起,并完全控制错误处理。例如,考虑以下给定id
的代码:指定订单的int和apiClient:订单管理微服务的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);
这将异步计算订单的总价,具有以下属性:
此外,IMO每次网络调用后的.Schedulers.io()
应该是隐式的-您可以通过修改创建Retrofit客户端的方式来做到这一点。对于11 2行代码来说还不错,即使它比Android更像后端。
Jake Wharton的RxBind/RxAndroid提供了一些不错的线程功能,您可以使用它们进行异步调用,但RxJava提供了比处理异步线程更多的好处/功能。也就是说,有一个相当陡峭的学习曲线(IMO)。此外,应该注意的是,使用AsyncTask没有错,您可以使用Rx编写更有说服力的解决方案(也IMO)。
TLDR您应该努力使用它。Retrofit和RxJava可以很好地配合您的AsyncTask替换目的。