RxJava - 观察可能总是在变化的数据

时间:2016-07-21 12:15:42

标签: java rx-java

我正试图加入反应潮流,但在阅读并经历了很多例子之后,我仍然没有找到我正在寻找的东西。

我有一个模型对象,可能会在应用程序的生命周期中的任何时间发生变化 更改可能来自更新它的特定请求(来自服务器,数据库等),也可能因应用程序中触发的事件而更新。

我的问题是如何创建此类对象的Observable以及如何在发生更改时不断更新订阅者?

从我到目前为止所看到的,我可以像这样创建可观察量:

Observable.create(new Observable.OnSubscribe<MyModel>() {
    @Override
    public void call(final Subscriber<? super MyModel> subscriber) {
        subscriber.onNext(MyModel instance);
    }
});

我在这里缺少的是:

  1. 我不想发出不同的值(MyModel的实例),只是想让订阅者知道同一个实例(他们订阅的实例)已经发生了变化。

  2. 如果我理解正确,那么每当新订阅者注册时都会调用call方法,但这不是我需要的,我只有在有更新然后我想要时才采取行动通知所有订阅者。

  3. 我很有可能把这一切都搞错了,这就是为什么我很高兴能够理解如何用RxJava来满足我的需求。

    感谢。

1 个答案:

答案 0 :(得分:18)

我认为做这样的事情的最佳选择是Subjects。所以你可以这样:

public static class MyModel {
    private PublishSubject<MyModel> changeObservable = PublishSubject.create();
    private String field1;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
        changeObservable.onNext(this);
    }

    public Observable<MyModel> getModelChanges() {
        return changeObservable;
    }

    @Override
    public String toString() {
        return "MyModel{" +
                "field1='" + field1 + '\'' +
                '}';
    }
}


public static void main(String[] args) {
    MyModel myModel = new MyModel();
    myModel.getModelChanges()
            .subscribe(System.out::println);

    myModel.setField1("1");
    myModel.setField1("2");
    myModel.setField1("3");
}

因此,模型中的所有设置者都会通知模型中的某些内容已发生变化,所有订阅者都会获得该数据。