Я сталкивался с несколькими примерами, когда люди пытались убедить меня использовать RxJava вместо стандартной конструкции Android AsyncTask.
На мой взгляд, RxJava предлагает намного больше возможностей, но проигрывает в простоте по сравнению с AsyncTask.
Существуют ли какие-либо варианты использования, которые подходят для одного подхода лучше, чем для другого, или даже в более общем плане RxJava вообще можно считать превосходящим?
Переведено автоматически
Ответ 1
Вся мощь RxJava видна, когда вы используете ее на Java 8, предпочтительно с библиотекой типа Retrofit . Она позволяет вам тривиально объединять операции в цепочку с полным контролем обработки ошибок. Для примера рассмотрим приведенный ниже код id: int, который определяет заказ, и ApiClient: модифицированный клиент для микросервиса управления заказами:
Это позволит асинхронно рассчитать общую стоимость заказа со следующими свойствами:
одновременно выполняется не более 5 запросов к API (и вы можете настроить планировщик ввода-вывода так, чтобы у него было жесткое ограничение для всех запросов, а не только для одной наблюдаемой цепочки)
до 2 повторных попыток в случае сетевых ошибок
-1 в случае сбоя (антипаттерн TBH, но это другое обсуждение)
Кроме того, IMO .subscribeOn(Schedulers.io()) после каждого сетевого вызова должно быть неявным - вы можете сделать это, изменив способ создания модифицированного клиента. Неплохо для 11 + 2 строк кода, даже если это больше похоже на серверную часть, чем на Android.
Ответ 2
RxBinding / RxAndroid от Джейка Уортона предоставляет некоторые приятные функции обработки потоков, которые вы можете использовать для выполнения асинхронных вызовов, но RxJava предоставляет гораздо больше преимуществ / функциональности, чем просто работа с асинхронной обработкой потоков. Тем не менее, существует довольно крутая кривая обучения (IMO). Также следует отметить, что в использовании AsyncTasks нет ничего плохого, вы можете просто писать более красноречивые решения с помощью Rx (также, IMO).
TLDR вам следует приложить усилия, чтобы использовать его. Retrofit и RxJava прекрасно работают вместе для замены AsyncTask.