我想更改从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;
});
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
编辑
我将代码更改为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);
});
Run Code Online (Sandbox Code Playgroud)
Ric*_*lay 11
对此的Rx解决方案是将您的时间间隔更改为自己的可观察对象.如果需要从外部呼叫者提供值,请使用主题.
然后,您可以将更改的值映射到timer
using switchMap
,这将在下一个计时器启动时自动终止.
归档时间: |
|
查看次数: |
3096 次 |
最近记录: |