如何实现与INotifyPropertyChanged等效的RxJava来生成Observable数据模型?

我是Java的新手,也是Rx的新手。 我处于深渊。 我正处于编写将使用MVC(模型 – 视图 – 控制器)模式的Android应用程序的早期阶段,我正在尝试各种方法,特别是RxJava。 我的想法是让我的模型成为一个Observable ,我的Observer 。 然后,模型(或包装类)每次数据更改时都会发出模型的新副本。 在.net中我会考虑使用INotifyPropertyChanged

我想我需要实现一个自定义的Observable – 但是怎么样? 有很多关于如何将集合转换为observable的文档,但这不适合我的用例,因为我没有集合 – 只有一个项目,即数据模型。 有没有办法做到这一点? 请记住,我正在为Android开发,所以我不能使用lambdas或类似的任何东西。

[更新]感谢AndréStaltz的回答,我想我已经离开了起跑线。 我想出了这堂课:

 import rx.Observable; import rx.subjects.BehaviorSubject; public class ObservableModel { private TModel modelData; private BehaviorSubject modelStream; private boolean disposed = false; public ObservableModel(TModel modelData) { this.modelData = modelData; modelStream = BehaviorSubject.create(modelData); } public TModel getModelData() { if (disposed) { throw new UnsupportedOperationException("The object has been disposed"); } return modelData; } public void setModelData(TModel modelData) { if (disposed) { throw new UnsupportedOperationException("The object has been disposed"); } this.modelData = modelData; modelStream.onNext(this.modelData); } public Observable getObservable() { return modelStream; } public void close() { modelStream.onCompleted(); modelStream = null; modelData = null; disposed = true; } } 

您不需要实现自定义Observable,因为Observable是通用的,只需指定Observable所属的types即可使用。

如果你看一下随着时间的推移而变化的模型对象,你真的会随着时间的推移拥有一组模型对象:[modelObject1,modelObject2,modelObject3,…]

实现此目的的一种简单方法是使用types为FooBarModel的静态Observable,即Observable

 public class FooBarModel { public static BehaviorSubject fooBarStream; // ... private int fooBarMember1; private int fooBarMember2; } 

而不是Observable ,我们使用了Subject(根据需要选择PublishSubject或BehaviorSubject),它类似于Event总线。 每次在FooBarModel中更改fooBarMember1或fooBarMember2时,都会通过调用fooBarStream.onNext(this)来发出fooBarStream.onNext(this)的实例,并且FooBarModel.fooBarStream的每个订阅者FooBarModel.fooBarStream将看到FooBarModel.fooBarStream的新实例。

然而,这实际上只是一种解决方案,还有很多其他方法可以做到这一点。 如果你的FooBarModel依赖于来自其他实体“Baz”的更新,那么将BehaviorSubject替换为Observable更有意义,而不是直接输入新实例,你只需使用一些转换/组合函数创建Observable(如作为“Baz”的Observables上的map(),flatMap(),delay(),filter()等)。


一个好的RxJava MVC架构是让所有三个Model,View和Controller都是Observables,它们彼此循环相关。

View观察Model的Observable的更新,并导出公共Observables的click事件,键盘事件,输入等。

Controller观察View的用户输入Observables,并处理这些输入,以适合模型的格式将它们导出为“已处理用户输入”的Observable。 例如,如果View具有Observable of search字段文本内容,则Controller分别导出Observable of lowercase搜索字段文本内容。 另一个示例:Controller将View中的单击事件解释为数据库请求。

模型从Controller观察“已处理的用户输入”,并导出应用程序数据的Observable。

在这种情况下,您不一定需要主题。 这种方法的好处是纯粹的关注点分离:任何实体都不会强制更新任何其他实体。 所有Controller逻辑完全仅在Controller中指定,而不是在其他地方指定。 此外,您还可以清楚地了解输入和输出。 实体观察其他实体并将其一些数据导出为Observables。 视图中没有调用“controller.updateThisAndThat()”。

但对于初学者来说,在更新观察者方面,使用主题因为它们很容易推理。