簡體   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