Android Rxjava 订阅变量变化
Android Rxjava subscribe to a variable change
我正在学习观察者模式,我希望我的可观察对象在某个变量的值发生变化时跟踪它并进行一些操作,我做过类似的事情:
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*/}
}
但是没有调用 doMethod2()
生活中没有什么是神奇的:如果您更新一个值,您的 Observable
将不会收到通知。你必须自己做。例如使用 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 没有什么是神奇的,不,但我认为我们可以获得比这更神奇的东西......
以这种方式使用 Rx BehaviourSubject
怎么样:
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); }
}
如果您希望观察代码看到初始值,请删除.skip(1)
。
变量支持保留在 BehaviourSubject
中,可以通过常规 Java Getter/Setter 访问。这当然是一个玩具示例:如果您的用例真的这么简单,就没有理由不写:
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 );
}
...但是使用 BehaviourSubject
可以让您将更改桥接到 class 中的其他 Rx 数据流,以组成更高级的行为。
如果对这里感兴趣,可以使用 Kotlin 版本的 Variable class,它允许订阅者在每次变量更改后进行更新。
class Variable<T>(private val defaultValue: T) {
var value: T = defaultValue
set(value) {
field = value
observable.onNext(value)
}
val observable = BehaviorSubject.createDefault(value)
}
用法:
val greeting = Variable("Hello!")
greeting.observable.subscribe { Log.i("RxKotlin", it) }
greeting.value = "Ciao!"
greeting.value = "Hola!"
这将打印:
"Hello!"
"Ciao!"
"Hola!"
我正在学习观察者模式,我希望我的可观察对象在某个变量的值发生变化时跟踪它并进行一些操作,我做过类似的事情:
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*/}
}
但是没有调用 doMethod2()
生活中没有什么是神奇的:如果您更新一个值,您的 Observable
将不会收到通知。你必须自己做。例如使用 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 没有什么是神奇的,不,但我认为我们可以获得比这更神奇的东西......
以这种方式使用 Rx BehaviourSubject
怎么样:
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); }
}
如果您希望观察代码看到初始值,请删除.skip(1)
。
变量支持保留在 BehaviourSubject
中,可以通过常规 Java Getter/Setter 访问。这当然是一个玩具示例:如果您的用例真的这么简单,就没有理由不写:
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 );
}
...但是使用 BehaviourSubject
可以让您将更改桥接到 class 中的其他 Rx 数据流,以组成更高级的行为。
如果对这里感兴趣,可以使用 Kotlin 版本的 Variable class,它允许订阅者在每次变量更改后进行更新。
class Variable<T>(private val defaultValue: T) {
var value: T = defaultValue
set(value) {
field = value
observable.onNext(value)
}
val observable = BehaviorSubject.createDefault(value)
}
用法:
val greeting = Variable("Hello!")
greeting.observable.subscribe { Log.i("RxKotlin", it) }
greeting.value = "Ciao!"
greeting.value = "Hola!"
这将打印:
"Hello!"
"Ciao!"
"Hola!"