Android 安卓&;Rx Java 2:对象更改时收到通知

Android 安卓&;Rx Java 2:对象更改时收到通知,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我试着用谷歌搜索,但结果都是关于RXJava1和2之间的变化。。。没什么帮助,哈哈 我是RXJava新手,正在努力学习。我可以很容易地创建一个可观察的,并且所有的用户都得到了正确的呼叫。我有一个问题: 对象myObject=something1 我创建了observable和所有订阅者,他们在onNext()方法中获得myObject 但是,在下面的某个地方,我们做了“myObject=something2” 如何通知订阅者myObject已更改 下面是我如何创建可观察的: Observable

我试着用谷歌搜索,但结果都是关于RXJava1和2之间的变化。。。没什么帮助,哈哈

我是RXJava新手,正在努力学习。我可以很容易地创建一个可观察的,并且所有的用户都得到了正确的呼叫。我有一个问题:

对象myObject=something1

我创建了observable和所有订阅者,他们在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);
            }
        });
Observable myObservable=Observable.create(newobservableOnSubscribe()){
@凌驾
public void subscribe(observeiemitter e)引发异常{
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() {

    }
};
@覆盖
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(mDisposableObserver);
}
私有可处置观察者mDisposableObserver=新可处置观察者(){
@凌驾
public void onNext(MyObject MyObject){
//使用“myObject”变量进行UI填充
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
};

旁注:如果有人对非常好的Rx Java 2教程有链接或建议(如…通过上帝状态的超级初学者),我将不胜感激

如果你不遵守“设置者”的规定,那么在你的对象被更改后,你不能立即得到通知如果对象已更改,则以某种方式通知的对象。使用安卓体系结构库中的可观测项修复了这个问题

无论如何,您可以轮询对象的更改,并在对象已更改时通知订阅者。使用repeatWhen和DistinutenChanged可确保在数据未更改的情况下不会发出数据。示例(未测试)可能是:

Observable myObservable=Observable.just(你的对象)
.repeatWhen(o->o.concatMap(v->Observable.timer(1000,TimeUnit.ms)))
.distinctUntilChanged();
myObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(d->Log.d(“数据”,“获取对象”+d),e->Log.e(“错误”,“接收错误:+e”);
另一个更好的尝试是修改对象/模型以观察更改(如架构组件中的观察)

这意味着您在模型中创建了一个发布主题,如果调用了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");
 }
公共静态类ModelClass{
private PublishSubject changeObservable=PublishSubject.create();
私有字符串字段1;
公共字符串getField1(){
返回字段1;
}
公共无效集合字段1(字符串字段1){
此字段1=字段1;
changeObservable.onNext(本);
}
公共可观察的getModelChanges(){
可观察的回报变化;
}
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ModelClass myModel=新的ModelClass();
订阅(c->Log.d(“更改:+c”);
myModel.setField1(“1”);
myModel.setField1(“2”);
myModel.setField1(“3”);
}
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");
 }