的Android Rxjava订阅变量变化
我学习Observer模式,我想我观察到的跟踪某个变量时,它改变了它的价值,并做一些操作,我已经做了一些类似:的Android Rxjava订阅变量变化
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*/}
}
我的印象是,观察者每次观察到对象发生变化时都会立即通知其所有订阅者。所以基本上我们需要不断告诉所有这些用户,让他们听取任何改变? –
你需要不断告诉你所有的Observable有什么变化。然后所有订户都会收到通知。 – dwursteisen
我想知道如果我想从''方法'内的'map'异步返回某个东西。我的意思是'返回String.valueOf(值);'是一个异步调用。 –
@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
让您桥更改其他Rx数据在你的课堂内部创造更多高级行为。
很久以前我离开了Java。这是我的想法。因为'VARIABLE_TO_OBSERVE'被复制到Observable。因此,没有观察到。如何'私人整数VARIABLE_TO_OBSERVE = 0;'? – Danh