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

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.

  • Progreso de descarga con RxJava, OkHttp y Okio en Android
  • No se puede convertir el objeto Subclase en cuerpo de solicitud json en Retrofit 2.0 con GsonConverterFactory
  • RxJava: encadenamiento de observables
  • Rx Java mergeDelayError no funciona como se esperaba
  • RxJava, ejecuta código en el hilo del observador antes de encadenar dos observables
  • ¿Cómo estructurar mi aplicación usando MVP con rxjava y retrofit para obtener datos de Observables?
  • Default Schedulers para rxjava en Android
  • Android Pros y Contras: Event Bus y RxJava
  • Schedulers.io () no vuelve al hilo principal
  • ¿Cómo reconstruir o restablecer caché Observable, utilizado con Retrofit para obtener nuevos datos?
  • OnNext comience otro Observable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.