gpt4 book ai didi

java - 我如何实现 INotifyPropertyChanged 的​​ RxJava 等价物来制作 Observable 数据模型?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:34 24 4
gpt4 key购买 nike

我是 Java 新手和 Rx 新手。我在深渊。我正处于编写将使用 MVC(模型- View - Controller )模式的 android 应用程序的早期阶段,我正在尝试各种方法来实现这一点,尤其是 RxJava。我的想法是让我的Model成为Observable,让我的View成为Observer。每次数据更改时,模型(或包装类)都会发出模型的新副本。在 .net 中,我会考虑使用 INotifyPropertyChanged

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

[更新]感谢 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,因为 Observable 是通用的,只需指定 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),它类似于事件总线。每次在 FooBarModel 中更改 fooBarMember1 或 fooBarMember2 时,都会通过调用 fooBarStream.onNext(this) 发出 FooBarModel 的实例。 ,以及 FooBarModel.fooBarStream 的每个订阅者将看到 FooBarModel 的新实例。

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


一个好的 RxJava MVC 架构是让所有三个模型、 View 和 Controller 都是相互循环依赖的 Observable。

View 观察来自 Model 的 Observable 的更新,并为点击事件、键盘事件、输入等导出公共(public) Observables。

Controller 观察 View 的用户输入 Observables,并处理这些输入以将它们以适合 Model 的格式导出为“已处理用户输入”的 Observables。比如View有一个搜索框文本的Observable,那么Controller分别导出一个小写搜索框文本的Observable。另一个例子:Controller 将来自 View 的点击事件解释为数据库请求。

模型观察来自 Controller 的“已处理的用户输入”,并导出应用程序数据的可观察对象。

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

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

关于java - 我如何实现 INotifyPropertyChanged 的​​ RxJava 等价物来制作 Observable 数据模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com