RxJava вместо AsyncTask?

я столкнулся с несколькими случаями, когда люди пытались убедить меня использовать RxJava вместо стандарта Android AsyncTask строительство.

на мой взгляд RxJava предлагает гораздо больше возможностей, но проигрывает в простоте отношении AsyncTask.

есть ли какие-либо варианты использования, которые подходят для одного подхода лучше, чем другой или даже более общий, может ли RxJava даже считаться превосходящим?

2 ответов


полная мощность RxJava видна, когда вы используете его на Java 8, предпочтительно с библиотекой, такой как Retrofit. Это позволяет вам тривиально связывать операции вместе, с полным контролем обработки ошибок. Например, рассмотрим следующий код id: int, указывающий заказ и apiClient: модифицированный клиент для микросервиса управления заказами:

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 в полете в любое время (и вы можете настроить планировщик ввода-вывода, чтобы иметь жесткий колпачок для всех запросов, а не только для одной наблюдаемой цепочки)
  • до 2 повторов в случае ошибок сети
  • -1 в случае отказа (антипаттерн TBH, но это другое обсуждение)

кроме того, ИМО .subscribeOn(Schedulers.io()) после каждого сетевого вызова должен быть неявным - вы можете сделать это, изменив способ создания модифицированный клиент. Неплохо для 11 + 2 строк кода, даже если это более бэкэнд-иш, чем Android-иш.


RxBinding/RxAndroid Джейком Уортоном предоставляет некоторые приятные функции потоковой передачи, которые можно использовать для асинхронных вызовов, но RxJava предоставляет waaay больше преимуществ / функциональности, чем просто работа с асинхронной потоковой передачей. Тем не менее, существует довольно крутая кривая обучения (IMO). Кроме того, следует отметить, что нет ничего плохого в использовании AsyncTasks, вы можете просто написать более красноречивые решения с Rx (также, IMO).

TLDR вы должны приложить усилия, чтобы использовать его. Retrofit и RxJava работайте вместе хорошо для ваших целей замены AsyncTask.