tutorial studio rxjava examples example ejemplos android rx-java observer-pattern

examples - rxjava android studio



Android Rxjava suscribirse a un cambio de variable (3)

Estoy aprendiendo el patrón de observador, quiero que mi observador realice un seguimiento de una determinada variable cuando cambie su valor y realice 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


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

¿Qué hay de usar 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); } }

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

El respaldo de la variable permanece en el BehaviourSubject y se puede acceder a él a través de Java Getter / Setter convencional. Este es un ejemplo de juguete, por supuesto: si su caso de uso fuera realmente tan simple, no habría excusa para no solo 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 unir cambios a otros flujos de datos Rx dentro de su clase para componer comportamientos más avanzados.


Nada es mágico en la vida: si actualizas un valor, tu Observable no será notificado. Tienes que hacerlo por ti mismo. 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*/} }


Si está interesado aquí, una versión Kotlin de la clase Variable, que permite que los suscriptores se actualicen después de cada cambio de variable.

class Variable<T>(private val defaultValue: T) { var value: T = defaultValue set(value) { field = value observable.onNext(value) } val observable = BehaviorSubject.createDefault(value) }

Uso:

val greeting = Variable("Hello!") greeting.observable.subscribe { Log.i("RxKotlin", it) } greeting.value = "Ciao!" greeting.value = "Hola!"

Esto imprimirá:

"Hello!" "Ciao!" "Hola!"