Давайте узнаем зачем нужны планировщики(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.