我有四个Flowable<Boolean>
,task0
,task1
,task2
和task3
。现在,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
我将如何处理?
答案 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