Android & Rx Java 2 : get notified when object changes

标签 android rx-java rx-java2

我试着用谷歌搜索这个,但结果都是关于 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/

相关文章:

java - Android RxJava - GroupBy 和合并回来?

android - SoftKeyboard 隐藏 EditText

rx-java - 异步发布到 Observable/Subject

android - 使用 rxjava 改造多图像上传问题

android - 将图像缩放到从我的手机中获取的不同可绘制文件夹以用作标题图像

android - 如何通过API获取用户的用户名和密码在GitHub上注册?

java - RxJava - 合并 2 个调用

java - RxJava 与顶点 : can't have multiple subscriptions exception

android - RxJava2 - 重复任务的间隔并在有条件的情况下运行可观察对象

java - RxJava 2.0 - 如何将 Observable 转换为 Publisher