Полная мощность 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-иш.
Я видел, что эта статья объясняет, почему, если это помогает. http://blog.feedpresso.com/2016/01/25/why-you-should-use-rxjava-in-android-a-short-introduction-to-rxjava.html – lsiva
Спасибо. Это немного похоже на то, как Scala обрабатывает параллелизм. Я буду выполнять некоторые тестовые прогоны в своих проектах, чтобы привыкнуть к RxJava. Однако, как вы думаете, существует фундаментальный недостаток функциональности AsyncTask? – qantik