虽然有可能在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