Rx java 使用RXJava和递增按钮进行倒计时
我正在为Android应用程序进行倒计时。 到目前为止,倒计时只是从10计数到1,工作正常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
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();}?