Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava-观察可能总是变化的数据_Java_Rx Java - Fatal编程技术网

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

RxJava-观察可能总是变化的数据,java,rx-java,Java,Rx Java,我正试图加入反应型的潮流,但在阅读了大量的例子之后,我仍然没有找到我想要的 我有一个模型对象,它可能在应用程序生命周期的任何时候都会发生更改。 更改可能来自特定的更新请求(来自服务器、数据库等),也可能由于应用程序中触发的事件而更新 我的问题是如何创建这样一个对象的可观察的,以及在发生变化时如何不断更新订户 从目前为止我所看到的情况来看,我可以创建如下可观察的: Observable.create(new Observable.OnSubscribe<MyModel>() {

我正试图加入反应型的潮流,但在阅读了大量的例子之后,我仍然没有找到我想要的

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

我的问题是如何创建这样一个对象的
可观察的
,以及在发生变化时如何不断更新订户

从目前为止我所看到的情况来看,我可以创建如下可观察的:

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

public void call(最终用户我认为这样做的最佳选择是。因此,您可以使用以下内容:

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");
}
公共静态类MyModel{
private PublishSubject changeObservable=PublishSubject.create();
私有字符串字段1;
公共字符串getField1(){
返回字段1;
}
公共无效集合字段1(字符串字段1){
此字段1=字段1;
changeObservable.onNext(本);
}
公共可观察的getModelChanges(){
可观察的回报变化;
}
@凌驾
公共字符串toString(){
返回“MyModel{”+
“field1=”+field1+“\”+
'}';
}
}
公共静态void main(字符串[]args){
MyModel MyModel=新的MyModel();
myModel.getModelChanges()
.subscribe(System.out::println);
myModel.setField1(“1”);
myModel.setField1(“2”);
myModel.setField1(“3”);
}

因此,模型中的所有设置者都会通知您的模型中发生了更改,所有订阅者都会获得该数据。

谢谢,我刚刚遇到了主题,这似乎是一个很好的解决方案,但我了解到主题是要避免的。有什么具体原因吗?@NitzanTomer我认为它们与功能世界不匹配,但问题是java不是函数式语言,主题只是与java的非函数部分合作的好方法。另外,您需要尽快取消主题订阅,否则可能会导致内存泄漏。一般来说,我认为这是一个非常有用和方便的工具。另一个选择是为每个更改源提供一个可观察的工具然后简单地合并它们,创建一个你可以订阅的可观察对象。@johnwows,你能用一个例子详细说明一下吗?谢谢!