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