1. Задержка действия выполнения
Он может быть реализован с использованием метода карты Timer+. Код заключается в следующем:
Visemble.timer (5, timeUnit.milliseconds) .map (value-> {return dosomething ();}). Подписаться (System.out :: println); } 2. Задержка результата отправки
Этот сценарий требует, чтобы действие генерации данных было немедленно выполнено, но результат задерживается при отправке. Это отличается от приведенного выше сценария.
Этот сценарий может быть реализован с использованием Observable.zip .
Оператор ZIP объединяет данные, передаваемые несколькими наблюдениями по порядку, каждые данные могут быть объединены только один раз, и все они упорядочены. Количество окончательных комбинированных данных определяется наблюдаемым, который передает наименьшие данные.
Для данных в одном и том же месте каждого наблюдаемого вам нужно ждать друг друга. То есть после создания данных в первом месте первого наблюдаемого, вы должны ждать данных в первом месте второго наблюдаемого, которое будет сгенерировано, и после создания данных в одном и том же месте каждого наблюдаемого вы можете объединить в соответствии с указанными правилами. Это действительно то, что мы хотим использовать.
В ZIP есть много видов объявлений, но оно примерно одинаково, которое должно пройти в нескольких наблюдаемых, а затем укажите правило для обработки данных в соответствующем месте каждого наблюдаемого и генерирования новых данных. Вот один из самых простых:
Public Static <T1, T2, R> наблюдаемый <r> Zip (наблюдаемый <? Extends T1> O1, наблюдаемый <? Extends T2> O2, Final Func2 <? Super T1,? Super T2,? Extends r> Zipfunction);
Результаты выполнения толкания и отправки с использованием ZIP следующие:
Usearbe.zip (usember.timer (5, timeUnit.milliseconds), visemable.just (dosomething ()), (x, y)-> y) .subscribe (System.out :: println));
3. Используйте DEFER для выполнения определенных действий в указанном потоке
Как и в следующем коде, хотя мы указываем метод запуска потока, функция doSomething() все еще выполняется в потоке, вызванном текущим кодом.
Visemable.just (dosomething ()) .subscribeon (schedulers.io ()) .observeon (schedulers.
Обычно мы используем следующие методы для достижения нашей цели:
Usearbe.create (s-> {s.onnext (dosomething ());}) .subscribeon (schedulers.io ()) .observeon (pradelers.compatation ()) .subscribe (v-> {utils.printlnwiththread (v.toString ());});Но на самом деле, мы можем достичь одной и той же цели, используя DEFER.
О отложении
Оператор DEFE - это то же самое, что и Create, просто от других операторов. Он создает операторов класса, но все данные, связанные с этим оператором, вступают в силу только в случае подписки.
заявление:
Public Static <t> наблюдаемый <t> defer (func0 <наблюдаемый <t>> vaselefactory);
Наблюдаемый в DEFER Func0 создается только при подписании.
эффект:
Не создайте наблюдаемый, пока наблюдатель не будет подписаться; Создайте свежий наблюдаемый на каждой подписке.
Другими словами, наблюдаемый создается при подписке.
Вышеуказанная проблема реализована с помощью DEFE:
Usearbe.defer (()-> vesectable.just (dosomething ())) .subscribeon (schedulers.io ()) .observeon (shadulers.compatation ()) .subscribe (v-> {utils.printlnwithththread (v.toString ());}); 4. Не сломайте структуру цепи, используя Compose
Мы часто видим следующий код:
Visemble.just (dosomething ()) .subscribeon (schedulers.io ()) .observeon (pradelers.compatation ()) .subscribe (v-> {utils.printlnwiththread (v.toString ()); В приведенном выше коде subscribeOn(xxx).observeOn(xxx) может быть одинаковой во многих местах. Если мы планируем реализовать его в определенном месте, мы можем написать это так:
private static <t> наблюдаемый <t> Applyschedulers (наблюдаемый <t> наблюдаемый) {return asbustable.subscribeon (schedulers.io ()) .observeon (schedulers.compatation ()); }Но каждый раз, когда нам нужно вызывать приведенный выше метод, он будет примерно похож на следующее, а самый внешний - это функция, которая эквивалентна нарушению структуры ссылки:
ApplySchedulers (visemble.from (someSource) .map (новый func1 <data> () {@Override public Data Call (Data Data) {return Manipulate (data);}})) .subscribe (new action1 <) () {@Override public void call (data data) {dosomelething (data);Оператор Compose может быть использован для достижения цели, чтобы не разбить структуру ссылки.
Заявление композиции выглядит следующим образом:
Общественный наблюдаемый компонент (Transformer <? Super T,? Extends R> Transformer);
Его входящий параметр - это интерфейс трансформатора, а выход - наблюдаемый. Трансформатор на самом деле является Func1<Observable<T> , Observable<R>> , другими словами: один тип наблюдаемого может быть преобразован в другой тип наблюдаемого.
Проще говоря, Compose может преобразовать исходное наблюдение в другой наблюдаемый с помощью указанного метода преобразования (трансформатор входного параметра).
Через Compose используйте следующий метод для указания метода потока:
Private Static <t> Transformer <T, t> Applyschedulers () {return new Transformer <t, t> () {@Override public asearbeable <t> call (наблюдаемый <t> наблюдаемый) {return asbustable.subscribeon (shadulers.io ()) .observeon (chadulers.compatation ()); }}; } Vaseleble.just (dosomething ()). Compose (ApplySchedulers ()) .subScribe (v-> {utils.printlnwiththread (v.toString ());});Функция применяется. Можно быть дополнительно упрощено, используя выражения Lambda до следующего:
Private Static <t> Transformer <T, t> Applyschedulers () {return vaseable-> visemble.subscribeon (schedulers.io ()) .observeon (shadulers.compatation ()); } 5. Используйте разные результаты выполнения в соответствии с приоритетом
Вышеуказанное название, вероятно, не выразило сценарий, который я хотел ясно выразить. Фактически, сценарий, который я хочу выразить, аналогичен обычному сценарию получения сетевых данных: если есть кэш, он будет получен из кэша, и если нет, он будет получен из сети.
Здесь требуется, что если есть кэш, действие получения данных из сети не будет выполнено.
Это может быть реализовано с использованием Concat+First.
CONCAT объединяет несколько наблюдаемых в один наблюдаемый и возвращает окончательный наблюдаемый. И эти данные похожи на отправку из наблюдаемого. Параметры могут быть несколькими наблюдаемыми или итератором, содержащим наблюдение.
Данные в новом наблюдаемом порядке расположены в порядке наблюдаемого в исходном CONCAT, то есть данные в новом результате сортируются в исходном порядке.
Ниже приводится реализация вышеуказанных требований:
Usearble.concat (getDataFromCache (), getDataFromNetwork ()). First () .SubScribe (v-> System.out.println ("Результат:"+V)); // Получить данные из Cache Private Static Sableable <string> getDataFromCache () {return vasemable.create (s -> {// dosomwhete, чтобы получить данные int value = new random (). Nextint (); value = value%2; if (value! s.oncompleted (); } // Получить данные из сети частной статической статической наблюдаемой <string> getDataFromNetwork () {return vaseble.create (s -> {for (int i = 0; i <10; i ++) {utils.println ("obs2 Generate"+i); S.Onnext ("Данные из сети:"+i); / /Gened Data} S. }В приведенной выше реализации, если GetDataFromCache имеет данные, код здесь в getDataFromNetwork не будет выполнен, что именно мы хотим.
Есть несколько реализаций, которые требуют внимания:
1. Возможно, что данные не могут быть получены из обоих мест. В этом сценарии использование First выставит исключение noshelementexception. Если этот сценарий имеет место, вам нужно заменить первое выше на первомортфолке.
2. В getDataFromCache() выше, если нет данных, мы называем Oncompleted напрямую. Если мы не вызовут Oncompleted, но вызовут OnerRor, то вышеупомянутое использование CONCAT не получит никаких результатов. Потому что, когда Concat получит любую ошибку, слияние остановится. Поэтому, если вы хотите использовать Onerror, вам нужно использовать Concatdelayerror вместо concat.concatDelayError Concatdelayerror сначала проигнорирует ошибку и отложит ошибку до конечной обработки.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи поможет вашему обучению или работе. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.