【问题标题】:RxJava - observe data that might always changeRxJava - 观察可能总是变化的数据
【发布时间】:2016-07-21 21:34:27
【问题描述】:

我正在尝试加入响应式潮流,但在阅读并浏览了很多示例之后,我仍然没有找到我想要的东西。

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

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

据我目前所见,我可以像这样创建 observable:

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

我在这里缺少什么:

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

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

很有可能我只是弄错了这一切,这就是为什么我很高兴了解如何使用 RxJava 来满足我的需求。

谢谢。

【问题讨论】:

    标签: java rx-java


    【解决方案1】:

    我认为做这样的事情的最佳选择是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");
    }
    

    因此,模型中的所有 setter 都会通知您的模型中发生了某些更改,并且所有订阅者都将获得该数据。

    【讨论】:

    • 谢谢,我刚刚遇到了这些主题,这似乎是一个很好的解决方案,但我读到应该避免这些主题。有什么具体原因吗?
    • @NitzanTomer 我认为它们与功能世界不匹配,但问题是 Java 不是功能语言,主题只是与 Java 的非功能部分合作的好方法。此外,您需要尽快取消订阅主题,否则您可能会出现内存泄漏。总的来说,我认为它非常有用和方便的工具。
    • 另一种选择是为每个变化源创建一个 observable,然后简单地将它们合并以创建一个您可以订阅的 observable。
    • @JohnWowUs,你能举个例子详细说明一下吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多