subscribeOn vs. наблюдаем
Подписаться будет вызывать метод создания Observable для данного планировщика.Неважно, сколько раз вы используете подписку.Первая подписка на source-observable (первая в цепочке) всегда побеждает.
наблюдать за переключением потока от оператора к оператору.Когда восходящий поток отправляет значение в потоке X, оно будет переключено на поток Y из заданного планировщика в наблюдаемом-операторе.Теперь все, что ниже, чем понаблюдать, будет обработано в потоке Y.
Наилучшее предположение на примере 1: Использование подписки вызовет Observable # create для Schedulers # io.Все в create-lambda будет вызываться в этом потоке из Schedulers # io.Обратный вызов слушателя (onTextChanged) может фактически происходить в другом потоке.В данном случае это UI-Thread, потому что это какой-то элемент UI.Теперь onNext будет вызываться из UI-Thread (emitter.onNext (it)).Значение будет передано оператору #map в потоке пользовательского интерфейса (.map {cheeseSearchEngine.search (it)}), а поиск cheeseSearchEngine # заблокирует поток в пользовательском интерфейсе.
Example2: используется в качестве первого оператора ".subscribeOn (AndroidSchedulers.mainThread ())».Это фактически не имеет никакого эффекта, потому что вы уже в UI-Thread.В этом случае create-lambda будет вызываться из AndroidSchedulers # mainThread.OnNext также будет передаваться в потоке пользовательского интерфейса, как раз в примере 1, потому что пользовательский интерфейс инициирует событие onTextChanged-Event.Затем это значение будет введено с помощью наблюдающего (Schedulers.io ()).Все из точки наблюдения будет выполнено в Schedulers # io-Thread.Это, в свою очередь, не будет блокировать пользовательский интерфейс, когда map выполняет какой-либо HTTP-запрос (или какой-то длительный ввод-вывод).После того, как карта закончена и отправляет следующее значение в нисходящем направлении, следующий наблюдающий (AndroidSchedulers.mainThread ()) переключится обратно на поток пользовательского интерфейса.Следовательно, теперь вы можете изменить UI в подписной лямбде, потому что вы находитесь в UI-Thread.В заключение можно отметить, что первая подписка в Примере2 может быть опущена, если не имеет значения, из какого потока происходит регистрация слушателя (слушатель-рег, вероятно, должен быть потокобезопасным).
Резюме: использование подписки будет тольковызовите создание лямбды на заданном Scheduler-Thread.Обратный вызов от зарегистрированного слушателя при создании может произойти в другом потоке.Вот почему Example1 будет блокировать UI-поток, а Example2 не будет.