如何实现INotifyPropertyChanged的RxJava等价物来创buildObservable数据模型?

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

我想我需要实现一个自定义Observable – 但是如何? 有很多关于如何将集合转换为可观察对象的文档,但是这不符合我的用例,因为我没有集合 – 只是一个单一的项目,即数据模型。 有没有办法做到这一点? 还记得我正在开发的Android,所以我不能使用lambda或任何幻想。

[更新]感谢安德烈·斯塔尔茨的回答,我认为我没有出发。 我想出了这个class级:

 import rx.Observable; import rx.subjects.BehaviorSubject; public class ObservableModel<TModel> { private TModel modelData; private BehaviorSubject<TModel> 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<TModel> getObservable() { return modelStream; } public void close() { modelStream.onCompleted(); modelStream = null; modelData = null; disposed = true; } } 

Solutions Collecting From Web of "如何实现INotifyPropertyChanged的RxJava等价物来创buildObservable数据模型?"

你不需要实现一个自定义的Observable,因为Observable是通用的,只是用来指定Observable的types。

如果您查看随时间变化的模型对象,那么随着时间的推移,您确实有模型对象的集合:[modelObject1,modelObject2,modelObject3,…]

实现这个的一个简单方法是获得一个types为FooBarModel的静态Observable,即Observable<FooBarModel>

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

而不是Observable<FooBarModel> ,我们使用了一个Subject(根据需要selectPublishSubject或BehaviorSubject),类似于一个Event bus。 每当您更改FooBarModel中的fooBarMember1或fooBarMember2时,都会通过调用fooBarStream.onNext(this)来发出fooBarStream.onNext(this)的实例,并且FooBarModel.fooBarStream的每个订户FooBarModel.fooBarStream将看到FooBarModel.fooBarStream的新实例。

不过,这实际上只是解决scheme的一个方面,还有很多其他的方法。 如果你的FooBarModel依赖于来自其他实体“Baz”的更新,那么用ObservablereplaceBehaviorSubject可能更有意义,而不是直接提供新的实例,你只需使用一些变换/组合函数来创buildObservable作为map(),flatMap(),delay(),filter()等)在“Baz”的观测量上。


一个好的RxJava MVC体系结构是让所有三个模型,视图和控制器成为循环相互依赖的可观察对象。

View观察来自Model的Observable的更新,并为click事件,键盘事件,input等输出公共Observable。

Controller观察View的用户inputObservable,并处理这些input,以适合于Model的格式将它们导出为“已处理用户input”的Observable。 例如,如果视图具有search字段文本内容的可视化,则控制器分别导出小写search字段文本内容的可视化。 另一个例子:控制器将视图中的点击事件解释为数据库请求。

该模型观察来自Controller的“已处理的用户input”,并导出应用程序数据的观察值。

在这种情况下,你不一定需要主题。 这种方法的好处是纯粹分离关注点:没有实体必须更新任何其他实体。 所有的控制器逻辑完全在控制器中指定,没有其他地方。 而且你也有一个干净的input和输出图像。 实体观察其他实体并将其一些数据导出为可观察对象。 View中没有调用“controller.updateThisAndThat()”。

但是对于初学者来说,使用Subjects是因为他们很容易推理,关于更新观察者。