使用RxJava的状态机?

时间:2017-09-06 00:38:49

标签: android rx-java rx-java2

我正试图全力投入RxJava并解决我遇到的这个问题,但它似乎非常不适合它,因为RxJava似乎不想处理任何类型的状态,而只是传递事件并改变他们来处理它们。

我试图用RxJava模拟的基本状态机行为是:

  1. 在应用启动活动中,等待下一个应用暂停。
  2. 在应用暂停事件中,启动15分钟计时器并等待下一个应用恢复。
    • 如果应用程序在计时器内恢复,请将其取消并返回步骤1.
  3. 在应用恢复活动中,如果15分钟计时器已过,请刷新并返回步骤1.

1 个答案:

答案 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订阅状态来确定计时器是否已触发,从而执行刷新。