我正在尝试全力以赴地使用 RxJava 并解决我遇到的这个问题,但它似乎非常不适合它,因为 RxJava 似乎不想处理任何类型的状态,而只是传递事件并改变它们来处理它们。
我尝试用 RxJava 模拟的基本状态机行为是这样的:
- 在应用程序启动事件中,等待下一次应用程序暂停。
- On app pause event, start a 15 minute timer and wait for the next app resume.
- 如果应用程序在计时器内恢复,请取消它并返回到步骤 1。
- 在应用程序恢复事件中,如果 15 分钟计时器已过,请刷新并返回到步骤 1。
虽然可以在 RxJava 中实现状态机,但它很快就会变得非常丑陋。您可以使用switchMap()
运算符来选择某些分支路径,并且您可以使用其他几个运算符进行分支和合并。
大多数问题是状态机转换看起来更像是go to
与结构化编程相比,它们根本不像函数式编程。
出于类似的原因,为任何重要的状态机创建流畅的或功能性的描述是相当困难的。有一个通用状态机的 RxJava 实现RxFsm https://github.com/furuholm/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
订阅状态以确定计时器是否已触发,从而执行刷新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)