Как повторить часть цепочки RxJava при выполнении условия? - PullRequest
0 голосов
/ 02 октября 2018

У меня четыре Flowable<Boolean> с, task0, task1, task2 и task3.Теперь task2 может перевернуть флаг, и если этот флаг станет истинным, цепочка должна начинаться с начала.* Если флаг не установлен, должно выполняться 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 голосов
/ 02 октября 2018

Разобрался:

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
...