我正试图全力投入RxJava并解决我遇到的这个问题,但它似乎非常不适合它,因为RxJava似乎不想处理任何类型的状态,而只是传递事件并改变他们来处理它们。
我试图用RxJava模拟的基本状态机行为是:
答案 0 :(得分:0)
虽然可以在RxJava中实现状态机,但它会变得非常难看,非常快。您可以使用switchMap()
运算符选择一些分支路径,并且可以使用其他几个运算符进行分支和合并。
大多数问题是状态机转换看起来更像go to
而不是结构化编程,而且它们往往根本不像函数式编程。
出于类似的原因,很难创建任何非平凡状态机的流畅或功能描述。有一般状态机RxFsm的RxJava实现,它看起来非常称职。您将提供定时器作为外部输入,以及其他此类解决方法。
这是使用一些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
订阅状态来确定计时器是否已触发,从而执行刷新。