gpt4 book ai didi

rx-java - 创建 Observable.timer 后如何更改计时器的间隔?

转载 作者:行者123 更新时间:2023-12-04 02:07:14 26 4
gpt4 key购买 nike

我想更改从 api 返回的间隔值。

我试过在订阅中重新创建计时器(和订阅)。但它不起作用。(因为它需要递归订阅......)

所以我使用成员作为间隔值。它有效。但它看起来不像 Rx 风格。

// default interval. it is member
int mInterval = 10;

int initialDelay = 5;
int period = 1;
Observable.timer(initialDelay, period, TimeUnit.SECONDS)
.filter(time_sec -> time_sec % mInterval == 0)
.flatMap(time_sec -> getIntervalSecFromApi())
.subscribe(new_interval_sec -> {
// do something
Log.d("timer_log", "end:do something");

// I want to recreate timer using new_interval_sec. but I have no idea...
// so I used member for interval value.
mInterval = new_interval_sec;
});

什么是最好的方法来做到这一点?

编辑

我将代码更改为 Rx 样式。
BehaviorSubject<Integer> timerSubject = BehaviorSubject.create(initialDelay);

timerSubject
.switchMap(interval -> Observable.timer(interval, interval, TimeUnit.SECONDS))
.flatMap(time_sec -> getIntervalSecFromApi())
.subscribe(new_interval_sec -> {
// do something
Log.d("timer_log", "end:do something:" + new_interval_sec);

timerSubject.onNext(new_interval_sec);
});

最佳答案

对此的 Rx 解决方案是将您不断变化的时间间隔视为它们自己的可观察对象。如果您需要从外部调用者提供值,请使用主题。

然后,您可以将更改的值映射到 timer使用 switchMap ,当下一个计时器开始时,它会自动终止前一个计时器。

关于rx-java - 创建 Observable.timer 后如何更改计时器的间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31240326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com