使用RXJava倒计时并增加Button

时间:2017-04-05 10:03:36

标签: rx-java rx-android

我正在为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,但我不知道如何实现它。 有人可以帮忙吗? :)

1 个答案:

答案 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,更新计时器值。

但是,在这个决定中你需要小心取消订阅。