1. Что такое RxJava •
Rx является Reactive Extensions стенографии, переведенной в расширение ответа. То есть путем передачи информации с одной стороны, а также другая информация, в ответ на код обработки кадра ядра.
• Фреймворк во главе с Microsoft архитектор развития команды Эрик Мейера и открыт в ноябре 2012 года.
• Rx поддерживает библиотека .NET, JavaScript и C ++ теперь поддерживает практически все популярные языка программирования.
• Rx язык большинства организация библиотека отвечает обслуживание ReactiveX, более популярное RxJava / RxJS / Rx.NET, сайт сообщества является reactivex.io.
• RxJava как популярный основы, опираясь на исходный код в GitHub, в дополнение к поддержке RxJava, кроме Android также поддерживает структуру RxAndroid
2.RxJava упростить код в целом мы проект Эндрюса, если вы хотите получить данные из фона и обновленного интерфейса, код что - то вроде взгляда давайте на примере:
Новая тема () {@Override общественного недействительный запуск () {super.run (); для (папки File: папки) {File [] файлы = folder.listFiles (); для (Файла: файлы) {если (. "PNG" file.getName () EndsWith ()) {конечного изображения растрового = getBitmapFromFile (файл); . GetActivity () runOnUiThread (новый Runnable () {@Override общественного недействительными запуска () {imageCollectorView.addImage (растровый);}}); } } } } }.Начало(); 上面 的 代码 经过 多层 嵌套 后 可读性 太差 了 如果 你 用 了 RxJava 可以 这样 写: Observable.from (папки) .flatMap (новый Func1 <File, Observable> () {@Override общественного Наблюдаемые вызова ( файл файла) {возвращение Observable.from (file.listFiles ());}}) .filter (новый Func1 <File, Boolean> () {@Override общественный Логический вызов (файл File) {возвращение file.getName () EndsWith. ( ".png");}}) .map (новый Func1 <File, Bitmap> () {@Override общественного Bitmap вызова (файл File) {вернуться getBitmapFromFile (файл);}}).
Преимущества этого письма заключается в снижении уровня вложенности улучшить читаемость кода, в дополнении упростить код, RxJava также предоставляет конкретные методы для каждого выполняющегося потока.
3. Введение рамок текущего RxJava было обновлено до версии 2.0, но для того , чтобы лучше понять RxJava, мы можем начать учиться с версии 1.0. Эндрюс также заказ для нашего проекта лучше использовать RxJava, может быть введен Gradle сценарий основан в проекте: компиляции «io.reactivex: rxandroid: 1.2.1 » компиляция «io.reactivex: rxjava: 1.1.6» Теперь наш проект был поддержан RxJava функции. 4. отзывчивым реагировать так называемые ядра, нет ничего более двух частей, одна часть отвечает за отправку события / сообщения, отвечает на другой части события / сообщения. Раньше, если мы хотим видеть новости, как правило , вам нужно прочитать газету. Например, вы заинтересованы в некоторых газетах и журналах, то вам сначала нужно сделать три вещи:
-
Укажите свой домашний адрес
-
Найти соответствующую газету
-
Подписаться на газетные газеты в течение месяца после указанного процесса, через день до тех пор, пока новая информация из газет, журналы газета будет отправлена на ваш дом.
Абстрактный пример кода выше, следующие шаги:
-
Предоставление зрителю (потому что вы обеспокоены содержанием журнала, чтобы наблюдать за людьми, чтобы вы, люди, мероприятия)
-
Предоставление зрителя (до тех пор, пока новый журнал из необходимости информирования заинтересованных лиц, так что газета является объектом, который будет наблюдаться)
-
Подписка (то есть, к наблюдателю и взаимосвязанно с наблюдаемым объектом сразу заметите изменения между наблюдателем наблюдает объект события)
Приведенный выше пример показывает код ниже: . // Создание наблюдаемого человека Observable Observable = Observable.create (новый новый Observable.OnSubscribe () {общественных недействительное @Override вызов (для Абонента Абонента) {<суперструн?> // 4 начинает передачу.. события // есть три типа событий onNext () OnCompleted () OnError ( ) // OnCompleted () OnError () , как правило , используется для отправки наблюдателя уведомления о событии закончена, как только выбрать один. subscriber.onNext ( "Hello Android!"); subscriber.onNext ( "Hello Java!"); subscriber.onNext ( "Hello C!"); subscriber.onCompleted ();}});
// Создание 2 наблюдателя подписчик абонента = новый подписчик () { @Override общественный недействительный OnCompleted () {Log.i (TAG, "OnCompleted");}
@Override public void onError(Throwable e) { Log.i(TAG, "onError: "+e.getLocalizedMessage()); } @Override public void onNext(String s) { Log.i(TAG, "onNext: "+s); } 复制代码
};
. // 3 подписки Observable.subscribe (для Абонента); выход следующим образом : com.m520it.rxjava I / IT520: onNext: Привет Android com.m520it.rxjava I / IT520: onNext: Привет Java com.m520it.rxjava I / !! IT520: onNext: Здравствуйте C com.m520it.rxjava I / IT520 :! • принцип OnCompleted код , выполняемый код , указанного выше, когда абонент наблюдателя подписался наблюдатели наблюдаемым, система будет автоматически вызывать обратный вызов внутри наблюдаемых объектов () , • В вызове наблюдаемый () метод объект, например, после отправки onNext / OnCompleted / OnError события. • Затем абонент сможет перезвонить к соответствующему методу. Эти три методы требуется передавать onNext, OnError, OnCompleted обычного наблюдателя Observable варианты и варианты , как единого наблюдаемый, только два метода: • OnSuccess - Одно единственного значение передачи этого метода • OnError - если не излучается после того, как требуемое значение, Одиночный запуск Throwable объекта к этому методу одно будет вызывать только один из этих двух способов, но только один вызов, вызов любого метода, прекратить отношения подписки. последний сингл сингл = Single.create (новый Single.OnSubscribe () {@Override общественного недействительными вызов (SingleSubscriber <? супер String> singleSubscriber) {// первый вызов onNext () последний звонок OnCompleted ()//singleSubscriber.onSuccess ( "Hello Android!"); //只调用OnError (); singleSubscriber.onError (новый NullPointerException ( "фиктивное исключение!")); }});
Наблюдатель Наблюдатель = новый наблюдатель () {@Override общественный недействительный OnCompleted () {Log.i (TAG, "OnCompleted"); }
@Override public void onError(Throwable e) { Log.i(TAG, "onError: "+e.getLocalizedMessage()); } @Override public void onNext(String s) { Log.i(TAG, "onNext: "+s); } 复制代码
}; Single.subscribe (наблюдатель); 6. наблюдатель варианты объектов Наблюдатель Наблюдатель, мы заменили с указанным выше Абонента объекта. Поскольку сам объект наследуется наблюдатель. Объект реализует onNext () & OnCompleted () & OnError () событие, если мы больше озабочены, какое событие, нужно только реализовать соответствующий метод, следующий код: // Создание наблюдателя подписчика абонента = новый подписчик () {@Override общественного недействительными OnCompleted () {Log.i (TAG, "OnCompleted");}
@Override public void onError(Throwable e) { Log.i(TAG, "onError: "+e.getLocalizedMessage()); } @Override public void onNext(String s) { Log.i(TAG, "onNext: "+s); } 复制代码
};
// Подписка observable.subscribe (подписчика) ;. Приведенный выше код, если вы заинтересованы только onNext () событие, но должен был реализовать OnCompleted () & OnError () событие, код становится очень громоздким. Учитывая это требование, RxJava подписка осуществляется в рамках конкретных корректировок, следующим образом: // Создать отдельный интерфейс Action1 onNextAction = новый ДЕЙСТВИЙ1 () {@Override общественного аннулируются вызов (String s) {Log onNext для указанного события. я (TAG, "вызов:" + S);}};
// Подписка observable.subscribe (onNextAction);
复制代码
пока я не знаю, если вы заметили, подписаться () подписка больше не наблюдатель, а конкретный onNext объектов интерфейса. Аналогичные функции следующим образом, мы можем достичь соответствующей подписки необходимо:
Открытая подписка подписаться (окончательный наблюдатель наблюдатель) открытая подписка подписаться (окончательная Action1 onNext) открытая подписка подписаться (окончательный ДЕЙСТВИЙ1 onNext, Action1 OnError) Открытая подписка подписываться (окончательный Action1 onNext, Action1 OnError, Action0 OnCompleted)
Существует также функция Foreach имеет аналогичную функцию:
общественного недействительный Foreach (конечная Action1 onNext) общественного недействительный Foreach (конечная Action1 onNext, Action1 OnError) общественного недействительный Foreach (конечная Action1 onNext, Action1 OnError, Action0 OnComplete)
## 7.Subject вариант
Раздел 2 выше, вводят в обоих варианты наблюдателя, и наблюдатель описывает варианты, описанные здесь, снова подвергать гермафродитный (которые будут использоваться как в качестве наблюдателя, может быть использована в качестве наблюдателя).
Есть четыре вида предмета для различных сценариев. Они не были все присутствующие во всех реализациях.
### AsyncSubject
AsyncSubject Наблюдаемое только после того, как оригинал будет завершена, последнее значение от первоначального выброса Наблюдаемое. Это последнее значение, он будет передавать любой последующий наблюдатель.
Опубликовано следующие коды: // Создать наблюдаемую конечную AsyncSubject тему = AsyncSubject.create (); // Создание Зрителя подписчик подписчика = новый подписчик () {@Override общественного недействительный OnCompleted () {Log.i (TAG, «OnCompleted «);}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError");
}
@Override
public void onNext(String s) {
Log.i(TAG, "s:" + s);
}
复制代码
} // подписаться на события subject.subscribe (абонента); // если событие было отправлено наблюдатели называют OnCompleted (), onNext () напечатает последнее событие, если нет, onNext () в любом случае не печатается. subject.onNext ( "Привет Android"); subject.onNext ( "Привет Java"); subject.onCompleted (); выход: s: Привет Java OnCompleted Однако, если исходный Наблюдаемое прекращается из-за ошибки, AsyncSubject не будет передавать любые данные, а просто передать это уведомление об ошибке вперед.
Выше, является таким же, как коды наблюдателей наблюдателя, теперь испускает серию сигналов, а ненормальный код выглядит следующим образом в конце:
subject.onNext ( "Hello Android"); subject.onNext ( "Hello Java"); // отправить исключение, потому что onNext () не может быть распечатана subject.onError (NULL); ### BehaviorSubject
Когда наблюдатель подписаться BehaviorSubject, событие, он будет подписываться на последней передачи до и после этого события был разослан всем абонентам распечатываются, если не отправить событие до подписки, она будет получать конструктор по умолчанию создавать (T) внутри объекта и подписки после всех событий, а именно: при условии BehaviorSubject = BehaviorSubject.create ( "NROMAL");
Абонент Абонента = новый абонент () {@Override общественный недействительный OnCompleted () {Log.i (TAG, "OnCompleted"); }
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError");
}
@Override
public void onNext(Object o) {
Log.i(TAG, "onNext: " + o);
}
复制代码
}; //Subject.onNext ( далее "Hello Android!"); //Subject.onNext ( далее "Здравствуйте Java!"); //Subject.onNext ( "C Hello!"); // здесь , чтобы подписаться , если выше 3 аннотации не удаляется, событие Привета C и подписаться на события обратно в силу , если указанные три комментария // удалить печать после вступления в силу конструктора НОРМАЛЬНЫХ событий и подписаться на заднюю часть вступления в силу событий subject.subscribe (абонент);
subject.onNext ( "Hello CPP!"); subject.onNext ( "Hello IOS!"); PublishSubject
PublishSubject будет происходить только после момента времени подписки данных от исходного излучения наблюдаемого к наблюдателю.
Обратите внимание, что, PublishSubject может создать полную немедленно начинает передачу данных, поэтому существует риск: Subject после того, как этот период времени должен быть создан до того, как зритель подписаться на него, один или более данные могут быть потеряны.
Код выглядит следующим образом: при условии PublishSubject = PublishSubject.create ();
Action1 onNextAction1 = новый Action1 () {
@Override
public void call(String s) {
Log.i(TAG, "onNextAction1 call: "+s);
}
复制代码
};
Action1 onNextAction2 = новый Action1 () {
@Override
public void call(String s) {
Log.i(TAG, "onNextAction2 call: "+s);
}
复制代码
};
subject.onNext ( "Hello Android!"); subject.subscribe (onNextAction1); subject.onNext ( "Hello Java!"); subject.subscribe (onNextAction2); subject.onNext ( "Hello IOS!");
Вывод заключается в следующем:
onNextAction1 вызов: Привет Java! onNextAction1 вызов: Привет IOS! onNextAction2 вызов: Привет IOS! ReplaySubject
ReplaySubject будет передавать все данные от оригинала Наблюдаемых наблюдателя, независимо от того, когда они подписываются.
Код выглядит следующим образом:
при условии ReplaySubject = ReplaySubject.create ();
Action1 onNextAction1 = новый Action1 () {
@Override
public void call(String s) {
Log.i(TAG, "onNextAction1 call: "+s);
}
复制代码
};
Action1 onNextAction2 = новый Action1 () {
@Override
public void call(String s) {
Log.i(TAG, "onNextAction2 call: "+s);
}
复制代码
};
subject.onNext ( "Hello Android!"); subject.subscribe (onNextAction1); subject.onNext ( "Hello Java!"); subject.subscribe (onNextAction2); subject.onNext ( "Hello IOS!");
Вывод заключается в следующем:
onNextAction1 вызов: Hello Android! onNextAction1 вызов: Привет Java! onNextAction2 вызов: Hello Android! onNextAction2 вызов: Привет Java! onNextAction1 вызов: Привет IOS! onNextAction2 вызов: Привет IOS! ### Тема 总结
AsyncSubject Всякий раз, когда подписка только получает событие последний onNext (), если происходит последнее исключение, он не будет печатать любой onNext () BehaviorSubject будет длиться ONEXT с фронта подписки (), чтобы начать печать не до конца. Если ни один звонок onNext перед тем подписки (), а затем вызвать Creat по умолчанию (T) не передается в объект. Если ненормальный после вызова, onNext не печатается (в любом случае только после подписки печати PublishSubject). ReplaySubject независимо от подписки в случае будет вызываться при отправке.
Выше кода показано, как RxJava с реализованы некоторые основные функции, мы надеемся, что мы можем принести другое вдохновение. Но это лишь малая доля от действительно намного хуже рамок Rx, используемых в проекте. Это также позволяет нам понять, прочную основу необходимо рассмотреть многие вещи, такие, как масштабируемость и читаемость оптимизации производительности коды, тестируемость, совместимость, экстремальные условия. Но иногда для того, чтобы достичь глубокого понимания сложной структуры принципов, мы должны очистить эти детали коды, вызывая больше внимания к логическому позвоночнику, упрощать.