Давайте узнаем зачем нужны планировщики(Schedulers)
Планировщики поставляются вместе с RxJava. По умолчанию RxJava выполняет задачи синхронно, но также можно определить их асинхронное выполнение. Для этого и нужны планировщики.
Например, нам необходимо выполнить задачу, которая требует 40мс времени. Это больше 16мс, при котором плавно отрисовывается 1 кадр пользовательского интерфейса. В результате мы можем получить приложение с подтормаживающим UI, что уже плохо по своей сути. Но благодаря RxJava мы можем определить выполнение сложной задачи в параллельном потоке, а коллбэк завершения может быть исполнен в основном потоке(MainThread).
Пример кода
Observable.from(Arrays.asList(1,2,3,4,5))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()))
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
//called on completion
}
@Override
public void onError(final Throwable e) {
//called when error occurs
}
@Override
public void onNext(final String s) {
Log.d("emit", s);
}
});
Вот что необходимо нам отметить из примера:
subscribeOn(Schedulers.newThread())
: это заставит Observable выполнять задачу в новом фоновом потоке.observeOn(AndroidSchedulers.mainThread())
: результат же мы будем получать на основном потоке пользовательского интерфейса Android.
Использование планировщиков зависит от очереди в работе через ограниченные или неограниченные пулы потоков. Вот несколько доступных вариантов, которые поставляются с RxJava.
Название планировщика | Описание |
Schedulers.computation() | Ограниченное кол-во потоков, которое зависит от кол-ва процессоров |
Schedulers.immediate() | Текущий поток |
Schedulers.io() | Поддерживаемый пулом потоков, который может расширяться по мере необходимости |
Schedulers.newThread() | Создает новый поток |
Schedulers.trampoline() | Планирует работу в текущем потоке, но ставит ее в очередь |
Библиотека RxAndroid поставляется с AndroidSchedulers.mainThread(), что является удобным способом доступа к основному потоку пользовательского интерфейса на Android.