用RxJava代替AsyncTask吗?
当人们试图说服我使用RxJava而不是Android的标准AsyncTask
构造时,我遇到了几个实例。
我认为RxJava提供了更多的功能,但相对而言却失去了简单性AsyncTask
。
有没有比第一种方法更适合一种方法的用例,或者甚至可以认为RxJava更通用?
回答:
当您在Java
8上使用RxJava的全部功能时,可以看到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);
这将异步计算具有以下属性的订单总价:
- 一次最多可以有5个针对该API的运行中的请求(并且您可以调整IO调度程序,使其对所有请求具有硬性限制,而不仅仅是针对单个可观察链)
- 如果发生网络错误,最多2次重试
- 失败时为-1(反模式TBH,但这是另一种讨论)
另外,IMO .subscribeOn(Schedulers.io())
应该在每个网络调用之后都是隐式的-
您可以通过修改创建Retrofit客户端的方式来实现。对于11 + 2行代码来说,这还不错,即使它比Android后端的后端风格还多。
以上是 用RxJava代替AsyncTask吗? 的全部内容, 来源链接: utcz.com/qa/423794.html