fbpx

Course Content

Total learning: 16 lessons Time: 1 week

Операторы subscribeOn() и observeOn(). Виды планировщиков

Операторы subscribeOn() и observeOn()

Методы subscribeOn() и observeOn() используются для переключения потоков. Как вы знаете, в Android  – приложенияx мы не можем делать запросы в сеть, не рекомендуется читать данные из базы данных в главном потоке или какие-то другие потенциально долгие операции, чтобы работа приложения казалась плавной.

Поэтому возможность легко переключаться между потоками и выводить долговременные операции в фоновый поток делает библиотеку RxJava незаменимым помощником для разработки мобильных приложений. 

Оператор subscribeOn()

Оператор subscribeOn() – говорит в какой поток наблюдаемый источник (source observable) будет передавать элементы. Это нужно для вывода работы в фоновый поток.

В данном примере с помощью оператора subscribeOn() мы переключаем поток и теперь данные приходят в computation в котором мы можем каким то образом обработать их. Чтобы переключиться – мы в аргументах должны указать тип планировщика. В данном примере это Schedulers.computation()

Переключение потока с помощью оператора subscribeOn()

Результат в логе:

Виды планировщиков

Есть несколько видов планировщиков:

Schedulers.io()

Schedulers.io() – этот планировщик основывается на неограниченном пуле потоков и используется для интенсивной работы с вводом-выводом без использования ЦП, например, доступ к файловой системе, выполнение сетевых вызовов, доступ к базе данных и так далее. Количество потоков в этом планировщике неограничено и может расти по мере необходимости.

Schedulers.computation()

Schedulers.computation() –  используется для выполнения работы, высоко нагружающей ЦП, такой как обработка больших объемов данных, изображений и так далее. Планировщик основывается на ограниченном пуле потоков с размером в количество доступных процессоров

Schedulers.newThread()

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

Schedulers.single()

Schedulers.single() – такой планировщик можно рассматривать, если вам необходимо выполнить всю работу последовательно в одном потоке. Такой тип планировщика может быть полезен если необходимо выполнить потоконебезопасный код в отдельном потоке

Schedulers.trampoline()

Schedulers.trampoline() – планирует работу в текущем потоке, но ставит ее в очередь

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

Оператор observeOn()

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

Переключение потока вниз по rx-цепочке на Schedulers.newThread()

В Андроид – приложениях для обновления UI после фоновой работы используется планировщик AndroidSchedulers.mainThread(). В следующем уроке мы на практике рассмотрим как переключаться между потоками для выполнения реальной задачи – получения данных через сетевой запрос и обновление UI.