2016-08-29 2 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

Полная мощность RxJava видна, когда вы используете его на Java 8, желательно с помощью библиотеки, такой как «Дооснащение». Это позволяет вам тривиально объединять операции вместе с полным контролем обработки ошибок. Например, рассмотрим следующий код данный id: Int, который определяет порядок и apiClient: клиент дооснащения для microservice управления заказами:

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 в случае неудачи (в антипаттерн ТВН, но это уже другая дискуссия)

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

+0

Большое спасибо за этот подробный пример. Я с нетерпением жду, чтобы возиться с этими первоклассными функциями. Не делал это в течение длительного времени на Java. – qantik

3

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

TLDR необходимо сделать попытку использовать его. «Модернизация» и «RxJava» прекрасно сочетаются с вашими задачами замены AsyncTask.

+0

Прохладный. Так вы скажете, что AsyncTask отлично подходит для небольших проектов, таких как простой HTTP-обработчик? – qantik

+0

Абсолютно, но вы можете выполнить те же самые действия с RxJava/RxBinding/RxAndroid, и вы можете получить некоторые интересные моменты для этого. –

+0

Очень приятно. Я всегда ищу элегантность. ;-) – qantik

Смежные вопросы