Android Rxjava suscribirse a un cambio de variable

Estoy aprendiendo patrón Observador, quiero que mi observable para realizar un seguimiento de una determinada variable cuando se cambia su valor y hacer algunas operaciones, he hecho algo como:

public class Test extends MyChildActivity { private int VARIABLE_TO_OBSERVE = 0; Observable<Integer> mObservable = Observable.just(VARIABLE_TO_OBSERVE); protected void onCreate() {/*onCreate method*/ super(); setContentView(); method(); changeVariable(); } public void changeVariable() { VARIABLE_TO_OBSERVE = 1; } public void method() { mObservable.map(value -> { if (value == 1) doMethod2(); return String.valueOf(value); }).subScribe(string -> System.out.println(string)); } public void doMethod2() {/*Do additional operations*/} } 

Pero doMethod2 () no se llama

2 Solutions collect form web for “Android Rxjava suscribirse a un cambio de variable”

Nada es mágico en la vida: si actualizas un valor, tu Observable no será notificado. Tienes que hacerlo tú solo. Por ejemplo, utilizando un PublishSubject .

 public class Test extends MyChildActivity { private int VARIABLE_TO_OBSERVE = 0; Subject<Integer> mObservable = PublishSubject.create(); protected void onCreate() {/*onCreate method*/ super(); setContentView(); method(); changeVariable(); } public void changeVariable() { VARIABLE_TO_OBSERVE = 1; // notify the Observable that the value just change mObservable.onNext(VARIABLE_TO_OBSERVE); } public void method() { mObservable.map(value -> { if (value == 1) doMethod2(); return String.valueOf(value); }).subScribe(string -> System.out.println(string)); } public void doMethod2() {/*Do additional operations*/} } 

@dwursteisen Nada es mágico, no, pero creo que podemos conseguir un poco más de magia que eso … 😊

¿Cómo sobre el uso de un Rx BehaviourSubject de esta manera:

 import rx.functions.Action1; import rx.subjects.BehaviorSubject; public class BehaviourSubjectExample { public BehaviourSubjectExample() { subject.skip(1).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { System.out.println("The value changed to " + integer ); } }); } public final BehaviorSubject<Integer> subject = BehaviorSubject.create(0); public int getValue() { return subject.getValue(); } public void setValue(int value) { subject.onNext(value); } } 

Quite el .skip(1) si desea que el código de observación vea el valor inicial.

El respaldo variable permanece con el BehaviourSubject y se puede acceder a través de Java Getter / Setter convencional. Éste es un ejemplo del juguete por supuesto: Si su caso del uso era realmente este simple no habría ninguna excusa para no apenas escribir:

 private int value = 0; public int getValue() { return value; } public void setValue(int value) { this.value = value; System.out.println("The value changed to " + value ); } 

… pero el uso de BehaviourSubject permite puentear los cambios a otros flujos de datos Rx dentro de su clase para componer comportamientos más avanzados.

  • Cancelación de varias suscripciones a la vez en RxAndroid - Android
  • ¿Cuál es la mejor manera de depurar los problemas de RxJava con mensajes no recibidos?
  • Manejo de excepciones API en RxJava
  • RxJava y MVP en la aplicación para Android
  • Android - RxJava vs AsyncTask para evitar la pérdida de memoria de getActivity ()
  • ¿Por qué RxJava con Retrofit en Android doOnError () no funciona, pero el suscriptor onError no
  • Utilizando RxJava para buscar objetos, transforma una lista contenedora y usa la lista
  • ¿Cómo recuperar cuerpo de respuesta con RxAndroid y Retrofit 2?
  • ¿Cómo utilizar Flowable en RxJava 2?
  • RxJava solicitudes de red y almacenamiento en caché
  • RXJava - ejecuta múltiples observables tras otro (como concat, pero con onCompleted para cada observable)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.