​​RxJava и планировщики

#разработка #начинающим



Сегодня реактивный подход используют для многих частей в проекте. Порой удивляешься, насколько разработчики пытаются использовать RxJava для всего, что только можно. Однако, на мой взгляд, наилучший вариант использования RxJava - работа с асинхронными операциями.



Для начала работы с многопоточностью используются операторы subscribeOn() и observeOn(), а также планировщики (Schedulers).



Например, в приложении есть метод getNames(), который возвращает список имен в приложение с сервера, после чего нам надо показать эти имена в списке. Для того, чтобы выполнить этот запрос в отдельном потоке мы должны использовать оператор subscribeOn() и указать в качестве Scheduler’а Schedulers.io(). Для обработки у нас есть оператор observeOn() с Scheduler’ом AndroidSchedulers.mainThread(), что позволит нам показать эти данные в main-thread.

Кроме этого есть дополнительные Scheduler’ы, которые важно применять с пониманием:

Schedulers.io() — его стоит использовать для операций, которые не связаны с интенсивной нагрузкой на процессор. Он использует неограниченный пул потоков, и количество потоков может расти по мере необходимости. В нашем примере мы использовали его для доступа в сеть. Также, его используют для доступа к файлам, получения информации из базы и прочим подобным операциям.

Schedulers.computation() — его рекомендуют использовать для операций, которые высоко нагружают процессор: обработка изображений, огромный объем данных. Но не стоит слепо ставить его во все запросы: пул у этого планировщика ограничен количеством процессоров на устройстве. Это сделано для того, чтобы отсутствовала конкуренция за ресурсы процессора в случае выполнения нескольких операций.

Schedulers.newThread() — его лучше использовать для операций, которые выполняются долгосрочно в фоне. Стоит также использовать осторожно, потому что создает новый поток при каждой обработке элемента.

Schedulers.single() — его стоит использовать в случае последовательного выполнения задач. Например, если вам важно, чтобы две задачи не выполнялись одновременно в приложении. Тоже не самый частый сценарий.

Schedulers.from(Executor executor) — можно написать собственный Executor и описать логику распределения потоков. Например, вы хотите ограничить количество запросов в сеть или в базу данных. Тогда можно использовать этот планировщик, это значительно упростит задачу.

AndroidSchedulers.mainThread() — используйте его, чтобы выполнить операцию в main-thread. В нашем примере — это показ списка имен на экран.



Важно правильно применять Scheduler’ы для каждой операции, так как их неверное применение может привести к росту числа потоков и замедлению приложения.



Надеюсь, что эта шпаргалка поможет лучше понимать логику работы с Scheduler в RxJava.