Cómo crear un observable de OnClick evento Android?

Soy nuevo en la programación reactiva. Así que tengo problema al crear una secuencia de un evento, como onClick, ontouch …

Alguien puede ayudarme a resolver este problema.

Gracias.

Harías algo como esto

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(); 

Ya que está utilizando Android, entonces ya puede incluir la dependencia rxjava-android contrib ahora conocida como ioreactivex:rxandroid . Ellos ya tienen una clase para facilitar esto. El método es ViewObservable.clicks . Puedes usarlo así.

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

Editar: Desde la versión 1.x, ViewObservable y muchas clases de ayuda se eliminan de RxAndroid . En su lugar, necesitará la biblioteca RxBinding .

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

Para el desarrollo de Android, eche un vistazo a RxBindings de Jake Wharton. Por ejemplo, le permite crear un observable y suscribirse a eventos de clic con:

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

O, mejor aún, con expresiones lambda (usando Kotlin , Java 8 o Retrolambda ):

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

Si está utilizando Kotlin, vale la pena señalar que RxBindings también proporciona funciones de extensión Kotlin que le permiten aplicar cada función de enlace directamente en el tipo de destino.

Puede usar un Asunto.

Un sujeto es una especie de puente o proxy que actúa tanto como suscriptor como como observable. Debido a que es un Suscriptor, puede suscribirse a uno o más Observables, y debido a que es un Observable, puede pasar a través de los elementos que observa reemitiéndolos, y también puede emitir nuevos elementos.

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

Cuando quiera publicar algo

 Events.myEvent.onNext(myObject); 

Cuando quiera recibir un evento

 Events.myEvent.subscribe (...); 

Uso de 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 } }); } }); 

Parece mucho más agradable usando lambdas:

 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); }); } }); 

O simplemente use RxBinding como lo indican otros.

Mi solución anterior es un patrón bastante general para envolver a los oyentes en un Observable sin embargo.

  • Observable OnCompleted no puede actualizar la interfaz de usuario
  • Android.os.NetworkOnMainThreadException usando rxjava en android
  • Observable vs Flujo rxJava2
  • Obtenga el objeto JSON uno por uno desde la matriz JSON en Android utilizando Retrofit y RxJava
  • ¿Cómo obtener el último valor de BehaviorSubject?
  • RxJava2 función de rebote no funciona correctamente en RecyclerView - Android
  • RxJava / Android: Combina el resultado de dos dependientes dependientes
  • Rx java retrofit 2 manejo de errores
  • ¿Cómo puedo implementar el equivalente RxJava de INotifyPropertyChanged para hacer un modelo de datos Observable?
  • Android gestiona la solicitud múltiple rxJava en el dispositivo de rotación
  • Disminuir los clics de botón mediante Rx
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.