我正在为Android应用程序倒计时。 到目前为止,倒计时从10点到1点都有效,而且效果很好。
Observable observable = Observable.interval(1, TimeUnit.SECONDS)
.take(10) // up to 10 items
.map(new Function<Long, Long>() {
@Override
public Long apply(Long v) throws Exception {
return 10 - v;
}
}); // shift it to 10 .. 1
我有多个下标,如下所示:
//subscription 1
observable.subscribe(new Consumer<Long>() {
@Override
public void accept(Long countdown) throws Exception {
Log.e(TAG,"countdown: "+countdown);
}
});
//subscription 2
observable.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object value) {
//whatever
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.d(TAG,"completed");
}
});
首先:这是一个很好的用例吗?我做得对吗?
我现在的问题是,我希望能够在用户按下按钮时增加倒计时。 因此我不能使用我当前的Observable,但我不知道如何实现它。 有人可以帮忙吗? :)
答案 0 :(得分:0)
这是我的解决方案:
private BehaviorSubject<Long> timer = BehaviorSubject.create();
...
timer
.compose(bindToLifecycle()) // unsubscribe when view closed
.switchMap(time -> Observable.intervalRange(0, time, 0, 1, TimeUnit.SECONDS)
.map(t -> time - t)) // restart timer always when timeLeft have new value
.compose(bindToLifecycle()) // unsubscribe when view closed
.doOnNext(this::updateTimerView)
.subscribe();
...
onButtonClick(){
timer.onNext(10);
}
我每次使用swithMap生成新的计时器observable,更新计时器值。
但是,在这个决定中你需要小心取消订阅。