我试着用谷歌搜索这个,但结果都是关于 rxjava 1 和 2 之间发生了什么变化......没有帮助,大声笑。
我是 Rx Java 的新手,正在研究它。我能够很容易地创建一个可观察对象,并且所有订阅者都得到了正确的调用。我只是有一个问题:
对象 myObject = something1;
我创建了可观察对象和所有订阅者,他们在 onNext() 方法中获得了 myObject。
但是,在某处,我们执行“myObject = something2”。
如何通知订阅者 myObject 已更改?
这是我创建可观察对象的方式:
Observable<MyObject> myObservable = Observable.create(new ObservableOnSubscribe<MyObject>() {
@Override
public void subscribe(ObservableEmitter<MyObject> e) throws Exception {
MyObject myObject = someObject1;
e.onNext(myObject);
}
});
这是我订阅的方式:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(mDisposableObserver);
}
private DisposableObserver<MyObject> mDisposableObserver = new DisposableObserver<MyObject>() {
@Override
public void onNext(MyObject myObject) {
// Do UI stuff with 'myObject' variables
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
旁注:如果有人有真正优秀的 Rx Java 2 教程的链接或建议(比如... super 初学者到神级),我将非常感激
最佳答案
如果您不观察对象的“setters”,如果对象已更改,您将无法在对象更改后立即收到通知。使用来自 android 架构库的 Observables 修复了这个问题。
无论如何,您可以轮询您的对象以获取更改并在对象已更改时通知订阅者。使用 repeatWhen 和 distintUntilChanged 可确保在未更改的情况下不会发出数据。示例(未经测试)可能是:
Observable<MyObject> myObservable = Observable.just(yourObject)
.repeatWhen(o -> o.concatMap(v -> Observable.timer(1000, TimeUnit.MILLISECONDS)))
.distinctUntilChanged();
myObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(d -> Log.d("Data", "Got Object "+ d), e -> Log.e("Error", "Received Error:" + e);
另一种更好的尝试是(如架构组件中的 Observables)您修改对象/模型以观察变化。
这意味着您在模型中创建了一个 Publish Subject,如果调用了 setter 将其自身作为值发送,它会收到通知。订阅这个主题意味着所有订阅这个主题的订阅者都会在 setter 被调用时立即收到通知,对象已更改。
public static class ModelClass {
private PublishSubject<ModelClass> changeObservable = PublishSubject.create();
private String field1;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
changeObservable.onNext(this);
}
public Observable<ModelClass> getModelChanges() {
return changeObservable;
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ModelClass myModel = new ModelClass ();
myModel.getModelChanges().subscribe(c -> Log.d("Change:" + c));
myModel.setField1("1");
myModel.setField1("2");
myModel.setField1("3");
}
关于Android & Rx Java 2 : get notified when object changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45849319/