2017-09-06 84 views
1

我想全力以赴在RxJava和解決這個問題,我與它,但它似乎是很不適宜,因爲RxJava似乎不想處理有任何種類的狀態,而僅沿事件和傳遞改變它們來處理它們。使用RxJava的狀態機?

的基本狀態機的行爲,我想用RxJava模仿是這樣的:

  1. 在應用程序啓動事件,等待下一個應用程序暫停。
  2. 在應用程序暫停事件,啓動一個15分鐘的計時器,並等待下一個應用程序的簡歷。
    • 如果應用程序在定時器中恢復,取消它,回到步驟1
  3. 在應用程序恢復事件,如果15分鐘的計時器已經過去,刷新並回到步驟1
+1

我們已經實施了一些類似的事情的方式是使用RX作爲一種單向事件總線的,其中應用程序會將總線上的事件,不同的觀察員關心不同的事件,每一個保持自己的狀態。這是我們的跟蹤架構,有超過一百個不同的事件和幾十個觀察者,每個處理不同的跟蹤事件 - 有時用於不同的跟蹤平臺。如果可能的話,我認爲將這個狀態保持在RX狀態將會過於複雜 - 尤其是如果您考慮到您的應用程序內存在系統中由BG擦除時可能必須保持該狀態。 – theFunkyEngineer

+0

是的,我認爲我們的應用類似。我們只是在最近才進行切換,對於我們來說仍然有很多探索可能/應該用Rx來完成,反之亦然。 –

+1

我想我們經歷了一個類似的過程,認識到「RX所有的東西」並不是一個好的方法。除了真正的基本土布事件總線進行跟蹤,對我們來說,RX鏈去僅在1個方向 - 從系統信息庫層向上通過交互件和演示者,其訂閱和直接調用視圖的方法。我們還沒有整理出新的ViewModel和生命週期管理軟件是否適合這種情況。 – theFunkyEngineer

回答

0

雖然有可能在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訂閱狀態,以確定計時器是否解僱,因此,執行刷新。