Rx java 如何阻止时间间隔不可见

Rx java 如何阻止时间间隔不可见,rx-java,Rx Java,我是rxjava新手,我想每2秒执行一个轮询任务50次,如果任务中满足某些条件,它可能会终止,我尝试使用Observable.interval,但我发现除了抛出异常之外,没有其他方法终止它,是否还有其他操作符可以满足我的目标? 顺便说一句,此功能作为API提供可观察对象,因此我无法通过解绑来控制订户和终止 Observable.interval(timeout, interval, TimeUnit.SECONDS) .flatmap(task - > task) 我猜Observabl

我是rxjava新手,我想每2秒执行一个轮询任务50次,如果任务中满足某些条件,它可能会终止,我尝试使用
Observable.interval
,但我发现除了抛出异常之外,没有其他方法终止它,是否还有其他操作符可以满足我的目标? 顺便说一句,此功能作为API提供可观察对象,因此我无法通过解绑来控制订户和终止

Observable.interval(timeout, interval, TimeUnit.SECONDS)
.flatmap(task - > task)

我猜
Observable.takeUntil(stopperedicate)
Observable.takeWhile(谓词)
可以帮助您:

Observable.interval(timeout, interval, TimeUnit.SECONDS) 
.takeWhile(val -> val < 42)
Observable.interval(超时、间隔、时间单位.秒)
.takeWhile(val->val<42)

此处observable将在第42次尝试时终止

您可以使用
takeUntil
停止一个
observable。间隔
,如下所示:

Observable.interval(0, 1, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .takeUntil(new Predicate<Long>() {
                @Override
                public boolean test(Long aLong) throws Exception {
                    return aLong == 10;
                }
            })
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    Log.d(TAG, "Tick: " + aLong);
                }
            });
可观测间隔(0,1,时间单位秒)
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(新谓词(){
@凌驾
公共布尔测试(长期)引发异常{
沿=10返回;
}
})
.订阅(新消费者){
@凌驾
public void accept(长期)引发异常{
日志d(标记“勾选:”+沿);
}
});

在本例中,10秒后,observable将停止。

以下代码将产生以下输出:

Starting interval..
Next tick is: 1
Next tick is: 2
Next tick is: 3
Next tick is: 4
Next tick is: 5
Interval complete
如果取消对此行的注释://If(t==3)dispose();“它将只打印以下内容:

Starting interval..
Next tick is: 1
Next tick is: 2
Next tick is: 3
守则:

         Observable.interval(1, TimeUnit.SECONDS).take(5).subscribeWith(new DisposableObserver<Long>() {
        @Override public void onStart() {                
            // do whatever might be needed here to run once before
            // the interval begins
            System.out.println("Starting interval..");
        }
        @Override public void onNext(Long t) {
            System.out.println("Next tick is: "+t);
            // if( t==3 ) dispose();
        }
        @Override public void onError(Throwable t) {
            t.printStackTrace();
        }
        @Override public void onComplete() {
            // will be called once when all 5 ticks are completed
            // will NOT be called if dispose() has been called
               System.out.println("Interval complete");
        }
    });
Observable.interval(1,TimeUnit.SECONDS)。take(5)。subscribeWith(新的可配置观察者(){
@重写公共void onStart(){
//做任何可能需要在这里运行一次的事情
//幕间休息开始了
System.out.println(“起始间隔”);
}
@覆盖公共void onNext(长t){
System.out.println(“下一个勾号为:“+t”);
//如果(t==3)dispose();
}
@覆盖公共无效onError(可丢弃的t){
t、 printStackTrace();
}
@重写公共void onComplete(){
//将在所有5个记号完成时调用一次
//如果已调用dispose(),则不会调用
System.out.println(“间隔完成”);
}
});

什么是超时,这是执行的最长时间还是发出第一个值的initialDelay?我们可以向此停止事件添加回调吗?i、 它还没有完成吗?我想我在找像doonnsbscribe()或doOnComplete()这样的东西