雖然有可能在RxJava實現一個狀態機,它變得非常難看,非常快。您可以使用switchMap()
運算符來選擇一些分支路徑,並且可以使用其他幾個運算符進行分支和合並。
大部分問題是狀態機轉換看起來比結構化編程更像go to
,它們往往不像功能編程。
由於類似的原因,這是很困難的創建任何非平凡狀態機的流利或功能描述。 RxJava實現了一般狀態機RxFsm,它看起來非常勝任。您將提供定時器作爲外部輸入以及其他此類解決方法。
這裏是實現你的國家機器,使用一些RxJava元素,並做一些簡化的假設代碼:
Observable<AppState> appStateObservable;
AtomicReference<Subscription> timerSubscription = new AtomicReference<>(Subscriptions.empty());
appStateObservable
.doOnNext(state -> if (state == START) doStartup())
.filter(state -> state != START)
.subscribe(state -> if (state == PAUSE) {
timerSubscription.set(Observable.timer(15, MINUTES)
.subscribe(timerSubscription.get().unsubscribe()));
} else if (timerSubscription.get().isUnsubscribed()) {
refresh();
} else {
timerSubscription.get().unsubscribe();
});
它使用timerSubscription
訂閱狀態,以確定計時器是否解僱,因此,執行刷新。
我們已經實施了一些類似的事情的方式是使用RX作爲一種單向事件總線的,其中應用程序會將總線上的事件,不同的觀察員關心不同的事件,每一個保持自己的狀態。這是我們的跟蹤架構,有超過一百個不同的事件和幾十個觀察者,每個處理不同的跟蹤事件 - 有時用於不同的跟蹤平臺。如果可能的話,我認爲將這個狀態保持在RX狀態將會過於複雜 - 尤其是如果您考慮到您的應用程序內存在系統中由BG擦除時可能必須保持該狀態。 – theFunkyEngineer
是的,我認爲我們的應用類似。我們只是在最近才進行切換,對於我們來說仍然有很多探索可能/應該用Rx來完成,反之亦然。 –
我想我們經歷了一個類似的過程,認識到「RX所有的東西」並不是一個好的方法。除了真正的基本土布事件總線進行跟蹤,對我們來說,RX鏈去僅在1個方向 - 從系統信息庫層向上通過交互件和演示者,其訂閱和直接調用視圖的方法。我們還沒有整理出新的ViewModel和生命週期管理軟件是否適合這種情況。 – theFunkyEngineer