Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:当原始条件不再满足时,如何重复可观察链?_Java_Rx Java - Fatal编程技术网

RxJava:当原始条件不再满足时,如何重复可观察链?

RxJava:当原始条件不再满足时,如何重复可观察链?,java,rx-java,Java,Rx Java,我想使用repeat()重新订阅一个可观察对象,但是当第一次订阅完成时,触发原始可观察对象的条件不再满足。在这种情况下,我将如何重新订阅observer 代码如下所示: RxInput.onInput(grid) .flatMap(Grid::handle) .flatMap(Grid::check) .delay(300, TimeUnit.MILLISECONDS) .flatMap(Grid::clean) .repeat() // Does not

我想使用
repeat()
重新订阅一个可观察对象,但是当第一次订阅完成时,触发原始可观察对象的条件不再满足。在这种情况下,我将如何重新订阅observer

代码如下所示:

RxInput.onInput(grid)
    .flatMap(Grid::handle)
    .flatMap(Grid::check)
    .delay(300, TimeUnit.MILLISECONDS)
    .flatMap(Grid::clean)
    .repeat() // Does not work
    .subscribe(g -> {System.out.println("Finished");});
public static <T> Observable<T> onInput(T t) {
    return Observable.create(subscriber -> {
        if(InputSystem.isInputOn()) { // This is not true anymore when re-subscribing
            subscriber.onNext(t);
        }
    });
}
Observable.defer(
  () -> {
     if (!InputSystem.isInputOn())
       return Observable.empty();
     else 
       return yourInput
         .flatMap(Grid::handle)
         .flatMap(Grid::check)
         .delay(300, TimeUnit.MILLISECONDS)
         .flatMap(Grid::clean)
         .repeat();
    })
  .subscribe(...);
RxInput.onInput()的代码如下所示:

RxInput.onInput(grid)
    .flatMap(Grid::handle)
    .flatMap(Grid::check)
    .delay(300, TimeUnit.MILLISECONDS)
    .flatMap(Grid::clean)
    .repeat() // Does not work
    .subscribe(g -> {System.out.println("Finished");});
public static <T> Observable<T> onInput(T t) {
    return Observable.create(subscriber -> {
        if(InputSystem.isInputOn()) { // This is not true anymore when re-subscribing
            subscriber.onNext(t);
        }
    });
}
Observable.defer(
  () -> {
     if (!InputSystem.isInputOn())
       return Observable.empty();
     else 
       return yourInput
         .flatMap(Grid::handle)
         .flatMap(Grid::check)
         .delay(300, TimeUnit.MILLISECONDS)
         .flatMap(Grid::clean)
         .repeat();
    })
  .subscribe(...);
公共静态可观测输入(T){
返回可观察。创建(订户->{
如果(InputSystem.isInputOn()){//重新订阅时不再是这样
订户.onNext(t);
}
});
}

如果
isInputOn
为false,则您似乎希望阻止初始订阅的排放,然后定义如下所示的可观测值:

RxInput.onInput(grid)
    .flatMap(Grid::handle)
    .flatMap(Grid::check)
    .delay(300, TimeUnit.MILLISECONDS)
    .flatMap(Grid::clean)
    .repeat() // Does not work
    .subscribe(g -> {System.out.println("Finished");});
public static <T> Observable<T> onInput(T t) {
    return Observable.create(subscriber -> {
        if(InputSystem.isInputOn()) { // This is not true anymore when re-subscribing
            subscriber.onNext(t);
        }
    });
}
Observable.defer(
  () -> {
     if (!InputSystem.isInputOn())
       return Observable.empty();
     else 
       return yourInput
         .flatMap(Grid::handle)
         .flatMap(Grid::check)
         .delay(300, TimeUnit.MILLISECONDS)
         .flatMap(Grid::clean)
         .repeat();
    })
  .subscribe(...);

一个额外的提示,尽你最大的努力避免使用
Observable。像上面的例子一样创建
。如果您确实发出这样的东西,那么您需要将您的可观测值与
.onbackpressurexx()结合起来
因为您可能会从
flatMap
下游等运营商处获得
MissingBackpressureException

您可以做的一件事是在Subscribe
类上创建一个实际的
,并保留一个成员,说明此操作是否启动。据我所知,repeat不会重新订阅任何内容。它只是收集已发射的项目并重新发射它们。所以很难说出你想要实现什么以及为什么它不适合你。
repeat
是否重新订阅(你可以在源代码中看到)