Базовая структура
Давайте сначала рассмотрим самый базовый код и проанализируем, как этот код реализован в Rxjava.
Visemble.OnsubScribe <string> onSubScribe1 = new Observable.OnsubScribe <String> () {@Override public void Call (aDpcriber <? Super String> indefbriber) {abcriber.onxext ("1"); andepriber.oncompleted (); }}; Indepcriber <string> nefbriber1 = новый подписчик <string> () {@override public void oncompleted () {} @override public void onerror (throwable e) {} @Override public void onnext (String S) {}}; usembebe.create (onSubScrbiber1).Во -первых, давайте посмотрим на код наблюдаемого. Create
Public Final Static <t> наблюдаемый <t> create (onsubscribe <t> f) {return new Newsable <t> (krok.oncreate (f));} Защищенный наблюдаемый (onSubScribe <T> f) {this.OnsubScribe = f;} Он напрямую вызывает конструктор наблюдаемого для создания нового наблюдаемого объекта. Мы временно отмечаем этот объект как наблюдаемый1 для последующего отслеживания.
В то же время, объект, в котором мы пропустили, будет сохранен в свойстве ObsubScribe Observable1. Это свойство очень важно в последующем контексте, пожалуйста, обратите внимание.
Затем давайте посмотрим на метод подписки.
Общественная окончательная подписка подписки (абонент <? Super T> adiquiber) {return asbustable.subscribe (абонент, это);} private static <t> подписка подписки (абонент <? Super t> подписчик, наблюдаемый <t> наблюдаемый) {... абонент. onstart (); kuck.onsubscribestart (наблюдаемый, наблюдаемый. onsubscribe) .call (подписчик); return chook.OnsubScriberTurn (абонент);} Как вы можете видеть, после подписки, метод Observable1.OnsubScribe.call называется непосредственно, который является методом вызова объекта OnSubScribe1 в нашем коде. Продолжившие параметры - это объект AboDscriber1, определенный в нашем коде. Что делается в методе вызова, так это вызов методам OnNext и Oncomplete входящего объекта подписчика1.
Это позволяет общаться между наблюдателем и наблюдателем. Разве это не очень просто?
public void Call (абонент <? Super String> adiquiber) {abscriber.onnext ("1"); andepcriber.oncompleted ();}Резюме сценария использования Rxjava
1. Сначала проверьте кэшированный сценарий
Получите данные, сначала проверьте, есть ли кэш в памяти, а затем проверьте, есть ли какое -либо предыдущее условие в кэше файла, и, наконец, следующее условие будет выполнено из сети.
Окончательный наблюдаемый <string> memory = usearbeable.create (new asbustable.onsubscribe <string> () {@override public void call (andepriber <? super string> ntquriber) {if (memormacache! = null) {andnext.onnext (memoryCache);} else {indCoriber.oncompleted ();}}}); Visemble.create (new asbustable.onsubscribe <string> () {@override public void call (andscriber <? Super String> indepriber) {string cachepref = rxpreferences.getString ("cache"). antiquiber.oncompleted ();}}}); Наблюдаемая <string> network = visionable.just ("network"); // Основное-полагаться на оператор CONCAT для реализации vasebure.concat (память, диск, сеть) .FIRST (). Подписаться (планировки.newthRead ()). Подписаться (s-> {memoryCache = "System.out.println (" ----- " + wascr--------------- s);});2. Интерфейс должен подождать, пока несколько интерфейсов одновременно соберет данные перед обновлением
// Разделите выход двух наблюдаемых, и порядок не гарантирован. Отправить в подписчик в порядке событий private void testmerge () {usearbeble <string> usearbeable1 = demoutils.createObServable1 (). Abscribeon (schedulers.newthread ()); Наблюдаемый <String> vaseleble2 = demoutils.createObServable2 (). Abpcribeon (Schedulers.newthread ()); Vasemble.merge (vesitable1, asbustable2) .subscribeon (schedulers.newthread ()) .subscribe (System.out :: println);}3. Запрос одного интерфейса зависит от данных, возвращаемых другим запросом API.
Например, после того, как нам нужно войти в систему, мы часто получаем список сообщений на основе токена, который мы получаем.
Здесь Rxjava используется для решения проблемы вложенных обратных вызовов. Есть правильное существительное, называемое обратным
Networkservice.getToken ("username", "password") .flatmap (s -> networkservice.getmessage (s)) .subscribe (s -> {System.out.println ("Сообщение:" + s);});4. Кнопка интерфейса должна предотвратить непрерывные щелчки
Rxview.clicks (findviewbyid (r.id.btn_throttle)) .ThrottleFirst (1, timeUnit.seconds) .subScribe (избегайте -> {System.out.println ("click");});5. Отзывчивый интерфейс
Например, флажок проверяется, и соответствующее предпочтение автоматически обновляется.
Предпочтения SharedPreferences = Preferencemanager.getDefaultsharedPreferences (this); rxsharedPreferences rxpreferences = rxsharedpreferences.create (предпочтения); предпочтения <boolean> проверено = rxpreferences.getboolean ("проверено", true) findViewByid (r.id.cb_test); rxcompoundbutton.checkedchanges (флажок) .subscribe (checked.asaction ());6. Сложное преобразование данных
Наблюдаемый. Just ("1", "2", "2", "3", "4", "5") .map (integer :: parseint) .filter (s -> s> 1). .subscribe (System.out :: println); // 9