2017-09-06 52 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订阅状态,以确定计时器是否解雇,因此,执行刷新。