繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM