Intereting Posts
Android. Сохраняйте уведомление на панели уведомлений. Android-браузер делает границы неправильными, если радиус границы меньше общей ширины границы Комментировать ярлык Android Studio Приложение не станет предпочтительным MediaButtonReceiver при вызове setActive (true) второй раз Почему onBackPressed () не вызывается? Проблема с веб-хостом, файлы .apk для загрузки из браузера android Как создать тестовые классы, которые можно использовать как в тестах Android, так и в модульных тестах? Просмотр списка с группами в android Изменение динамической ширины и высоты размещения Retrofit2 Опубликовать снимок как base64 Всегда ли RecyclerView.ViewHolder должен быть внутренним классом? Кнопка входа в Google Android и кнопка Facebook sdk 4+ Android – сервис прекращается, когда активность разрушается В результате произошло просочившееся окно, которое было первоначально добавлено Android-клавиатура не отображается в эмуляторе

Как создать наблюдаемое из OnClick Event Android?

Я новичок в реактивном программировании. Поэтому у меня возникает проблема при создании потока из события, например onClick, ontouch …

Может ли кто-нибудь помочь мне решить эту проблему.

Благодарю.

Solutions Collecting From Web of "Как создать наблюдаемое из OnClick Event Android?"

Вы бы сделали что-то подобное

Observable<View> clickEventObservable = Observable.create(new Observable.OnSubscribe<View>() { @Override public void call(final Subscriber<? super View> subscriber) { viewIWantToMonitorForClickEvents.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (subscriber.isUnsubscribed()) return; subscriber.onNext(v); } }); } }); // You can then apply all sorts of operation here Subscription subscription = clickEventObservable.flatMap(/* */); // Unsubscribe when you're done with it subscription.unsubscribe(); 

Поскольку вы используете Android, то вы уже можете включить в себя rxjava-android contrib rxjava-android известную как ioreactivex:rxandroid . У них уже есть класс, чтобы облегчить это. Метод – ViewObservable.clicks . Вы можете использовать его так.

 Observable<View> buttonObservable = ViewObservable.clicks(initiateButton, false); buttonObservable.subscribe(new Action1<View>() { @Override public void call(View button) { // do what you need here } }); 

Изменить: Начиная с версии 1.x, ViewObservable и многие вспомогательные классы удаляются из RxAndroid . Вместо этого вам понадобится библиотека RxBinding .

 Observable<Void> buttonObservable = RxView.clicks(initiateButton); buttonObservable.subscribe(new Action1<Void>() { @Override public void call(Void x) { // do what you need here } }); 

Для разработки Android, посмотрите на RxBindings Джейка Уортона. Например, он позволяет создавать наблюдаемые и подписываться на события click с помощью:

 RxView.clicks(myButton) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { /* do something */ } }); 

Или, что еще лучше, с лямбда-выражениями (используя либо Kotlin , Java 8, либо Retrolambda ):

 RxView.clicks(myButton) .subscribe(aVoid -> /* do something */); 

Если вы используете Kotlin, стоит отметить, что RxBindings также предоставляет функции расширения Kotlin, которые позволяют применять каждую функцию привязки непосредственно к целевому типу.

Вы можете использовать тему.

Предмет – это своего рода мост или прокси-сервер, который действует как подписчик и как наблюдаемый. Поскольку он является подписчиком, он может подписаться на один или несколько наблюдаемых, и поскольку он является наблюдаемым, он может проходить через элементы, которые он наблюдает, переиздавая их, а также может генерировать новые элементы.

 public enum Events { public static PublishSubject <Object> myEvent = PublishSubject.create (); } 

Когда вы хотите публиковать что-то

 Events.myEvent.onNext(myObject); 

Когда вы хотите получить событие

 Events.myEvent.subscribe (...); 

Использование RxJava 2:

 return Observable.create(new ObservableOnSubscribe<View>() { @Override public void subscribe(ObservableEmitter<View> e) throws Exception { clickView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { e.setCancellable(new Cancellable() { @Override public void cancel() throws Exception { view.setOnClickListener(null); } }); e.onNext(view); // Or whatever type you're observing } }); } }); 

Выглядит намного лучше, используя лямбды:

 return Observable.create(new ObservableOnSubscribe<View>() { @Override public void subscribe(ObservableEmitter<View> e) throws Exception { keypad.setOnClickListener(view -> { e.setCancellable(() -> view.setOnClickListener(null)); e.onNext(view); }); } }); 

Или просто используйте RxBinding, как указано другими.

Мое решение выше – довольно общий шаблон для обертывания слушателей в Observable.