满足条件时如何重复RxJava链的一部分?

时间:2018-10-02 06:39:55

标签: java rx-java2

我有四个Flowable<Boolean>task0task1task2task3。现在,task2可能会翻转一个标志,并且如果该标志变为true,则链应该从头开始。仅当未设置标志时,才执行task3

在伪代码中,将是这样的:

boolean shouldRestart = false
do:
    shouldRestart = false
    execute task 0
    execute task 1
    execute task 2 <-- this might set shouldRestart to true
while shouldRestart == true
execute task 3

这如何转换为RxJava?我试图像这样模拟它:

AtomicBoolean b = new AtomicBoolean(true);
task0.concatWith(task1)
    .concatWith(task2)
    .repeatWhen(f -> f.flatMap(b -> {
        boolean a = b.getAndSet(false);
        return a ? Flowable.just(b) : Flowable.empty();
    }))
    .concatWith(task3)
    .subscribe(b -> System.out.println("b: " + b));

这确实正确地重复了任务0、1和2,但它还会调用最终的观察者,并且从不执​​行任务3:

Task 0
b: true
Task 1
b: true
Task 2
b: true
Task 0
b: true
Task 1
b: true
Task 2
b: true

我追求的结果是这样的:

Task 0
Task 1
Task 2
Task 0
Task 1
Task 2
Task 3
b: true

我将如何处理?

1 个答案:

答案 0 :(得分:0)

想通了:

AtomicBoolean i = new AtomicBoolean(false);
Single<Boolean> chain = task0.concatWith(task1)
    .concatWith(task2)
    .repeatUntil(() -> i.getAndSet(true))
    .concatWith(task3)
    .lastOrError();

chain.subscribe(b -> System.out.println("b: " + b));

这将导致想要的行为:

Task 0
Task 1
Task 2
Task 0
Task 1
Task 2
Task 3
b: true