Android& Rx Java 2:在对象更改时得到通知

时间:2017-08-23 21:09:49

标签: android rx-java rx-java2

我尝试使用谷歌搜索,但结果都是关于rxjava 1和2之间的变化......不是很有帮助,哈哈。

我是Rx Java的新手,正在努力解决这个问题。我能够很容易地创建一个可观察的,并且所有订阅者都能获得正确的呼叫。我只是有一个问题:

对象myObject = something1;

我创建了observable和所有订阅者,他们在onNext()方法中获取myObject。

但是,在某个地方,我们做了#34; myObject = something2"。

如何通知订阅者myObject已更改?

以下是我创建observable的方法:

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教程的链接或建议(比如......超级初学者通过上帝状态),我非常感激

1 个答案:

答案 0 :(得分:1)

如果您没有观察到对象的“设置者”,如果对象已被更改,则无法通知对象的“setter”。使用Android架构库中的Observable修复了这个问题。

无论如何,您可以轮询您的对象以进行更改,并在对象已更改时通知订阅者。使用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),您可以修改对象/模型以观察更改。

这意味着您在模型中创建了一个发布主题,如果已经调用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");
 }