Как создать наблюдаемое из 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.