[英]How can I implement the RxJava equivalent of INotifyPropertyChanged to make an Observable data model?
我是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<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;
}
}
您不需要实现自定义Observable,因为Observables是通用的,并且只需指定Observable所属的类型即可使用。
如果你看一下随着时间的推移而变化的模型对象,你真的会随着时间的推移拥有一组模型对象:[modelObject1,modelObject2,modelObject3,...]
实现此目的的一种简单方法是使用类型为FooBarModel的静态Observable,即Observable<FooBarModel>
:
public class FooBarModel {
public static BehaviorSubject<FooBarModel> fooBarStream;
// ...
private int fooBarMember1;
private int fooBarMember2;
}
而不是Observable<FooBarModel>
,我们使用了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,并处理这些输入,以适合Model的格式将它们导出为“已处理用户输入”的Observable。 例如,如果View具有Observable of search字段文本内容,则Controller分别导出Observable of lowercase搜索字段文本内容。 另一个示例:Controller将View中的单击事件解释为数据库请求。
模型从Controller观察“已处理的用户输入”,并导出应用程序数据的Observable。
在这种情况下,您不一定需要主题。 这种方法的好处是纯粹的关注点分离:任何实体都不会强制更新任何其他实体。 所有Controller逻辑完全仅在Controller中指定,而不是在其他地方指定。 此外,您还可以清楚地了解输入和输出。 实体观察其他实体并将其一些数据导出为Observable。 视图中没有调用“controller.updateThisAndThat()”。
但对于初学者来说,在更新观察者方面,使用主题因为它们易于推理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.