how - RxJava en lugar de AsyncTask?
rxjava gradle (2)
El poder total de RxJava es visible cuando lo usa en Java 8, preferiblemente con una biblioteca como Retrofit.
Le permite encadenar trivialmente las operaciones, con un control total del manejo de errores.
Por ejemplo, considere el siguiente código dado
id
: un int que especifica el pedido y apiClient: un cliente Retrofit para el microservicio de gestión de pedidos:
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);
Esto calculará asincrónicamente el precio total de un pedido, con las siguientes propiedades:
- a lo sumo 5 solicitudes contra la API en vuelo en cualquier momento (y puede ajustar el planificador de IO para que tenga un límite máximo para todas las solicitudes, no solo para una sola cadena observable)
- hasta 2 reintentos en caso de errores de red
- -1 en caso de falla (un TBH antipatrón, pero esa es otra discusión)
Además, IMO the
.subscribeOn(Schedulers.io())
después de cada llamada de red debe estar implícito; puede hacerlo modificando cómo crea el cliente Retrofit.
No está mal para 11 + 2 líneas de código, incluso si es más backend-ish que Android-ish.
Encontré varias instancias en las que la gente intentaba persuadirme para que usara RxJava en lugar de la construcción
AsyncTask
estándar de Android.
En mi opinión, RxJava ofrece muchas más funciones pero pierde simplicidad contra
AsyncTask
.
¿Hay algún caso de uso que se adapte mejor a un enfoque que al otro o incluso más general? ¿Puede RxJava considerarse incluso superior?
RxBinding / RxAndroid de Jake Wharton proporciona una buena funcionalidad de subprocesos que puede usar para hacer llamadas asincrónicas, pero RxJava proporciona muchísimos más beneficios / funcionalidades que solo tratar con subprocesos asincrónicos. Dicho esto, hay una curva de aprendizaje bastante empinada (IMO). Además, debe tenerse en cuenta que no hay nada de malo en usar AsyncTasks, solo puede escribir soluciones más elocuentes con Rx (también, IMO).
TLDR debe hacer un esfuerzo para usarlo. Retrofit y RxJava funcionan bien juntos para sus propósitos de reemplazo de AsyncTask.