Course Content
-
Введение в RxJava 3.0. Способы создания Observable В первом модуле вы узнаете чем отличается Observable от Observer и поймете как создать источник данных
-
Основные операторы RxJava 3.0 Рассмотрим на примерах самые популярные операторы RxJava 3.0 такие как map(), flatMap(), filter() и другие.
-
Выходим в сеть с помощью RxJava
Операторы subscribeOn() и observeOn(). Виды планировщиков
Операторы subscribeOn() и observeOn()
Методы subscribeOn() и observeOn() используются для переключения потоков. Как вы знаете, в Android – приложенияx мы не можем делать запросы в сеть, не рекомендуется читать данные из базы данных в главном потоке или какие-то другие потенциально долгие операции, чтобы работа приложения казалась плавной.
Поэтому возможность легко переключаться между потоками и выводить долговременные операции в фоновый поток делает библиотеку RxJava незаменимым помощником для разработки мобильных приложений.
Оператор subscribeOn()
Оператор subscribeOn() – говорит в какой поток наблюдаемый источник (source observable) будет передавать элементы. Это нужно для вывода работы в фоновый поток.
В данном примере с помощью оператора subscribeOn() мы переключаем поток и теперь данные приходят в computation в котором мы можем каким то образом обработать их. Чтобы переключиться – мы в аргументах должны указать тип планировщика. В данном примере это Schedulers.computation()
Результат в логе:
Виды планировщиков
Есть несколько видов планировщиков:
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()
В Андроид – приложениях для обновления UI после фоновой работы используется планировщик AndroidSchedulers.mainThread(). В следующем уроке мы на практике рассмотрим как переключаться между потоками для выполнения реальной задачи – получения данных через сетевой запрос и обновление UI.