Rx java 使用RXJava和递增按钮进行倒计时

Rx java 使用RXJava和递增按钮进行倒计时,rx-java,rx-android,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 publ

我正在为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
Observable-Observable=Observable.interval(1,TimeUnit.SECONDS)
.取(10)//最多10项
.map(新函数(){
@凌驾
公共长应用(长v)引发异常{
返回10伏;
}
}); // 把它移到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");
        }
    });
//订阅1
可观察。订阅(新消费者(){
@凌驾
public void accept(长倒计时)引发异常{
Log.e(标签“倒计时:”+倒计时);
}
});
//订阅2
可观察。订阅(新观察者(){
@凌驾
认购的公共无效(一次性d){
}
@凌驾
public void onNext(对象值){
//随便
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
日志d(标记“已完成”);
}
});
首先:这是一个好的用例吗?我做得对吗

我现在的问题是,我希望能够在用户按下按钮时增加倒计时。 因此,我不能使用当前的Observable,但我不知道如何实现它。 有人能帮忙吗?:)

这是我的解决方案:

    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);
    }
private BehaviorSubject timer=BehaviorSubject.create();
... 
计时器
.compose(bindToLifecycle())//关闭视图时取消订阅
.switchMap(时间->可观察的.intervalRange(0,时间,0,1,时间单位.秒)
.map(t->time-t))//始终在timeLeft有新值时重新启动计时器
.compose(bindToLifecycle())//关闭视图时取消订阅
.doOnNext(此::updateTimerView)
.subscribe();
...
onButtonClick(){
定时器onNext(10);
}
我使用swithMap生成新的可观察计时器,每次都会更新该计时器值


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

我不明白您为什么需要2个订户。将您的使用者代码放入subscription2的onNext()。我认为interval是一个热门的可观察对象。您需要一个replay().autoConnect(),如果您想让两个订户获得相同的值。@Phoenix Wang我不仅使用2个订户,而且使用4个订户,因为它们位于不同的位置。可观察对象在服务中,1个订户是UI中的倒计时,1个订户在倒计时结束后更新按钮,1个订户启动另一个服务。。等等我以为这就是我用这个图案的目的?@Phoenix Wang哦,是的,你完全正确。。天气很热,所以我的想法是错误的嗨!首先要知道,每个订阅者都有自己的时间间隔。这意味着,订阅完成后,每个订阅的倒计时将独立开始。你可以在互联网上阅读更多关于搜索“冷热观测”的信息。实现将取决于您的服务API。它是否类似于接口CountdownService{void start();void addMoreTime(长毫秒),observeable finishedAfter();}?