2014-12-09 2 views
3

Скажем, у меня есть 2 наблюдаемых объекта (A & B), которые по сути являются сетевыми вызовами (с использованием «Дооснащения» для предоставления контекста).Понимание потоков данных и нескольких подписчиков (с использованием модификации)

В настоящее время поток приложения выглядит следующим образом:

  • & В имеют стартовал примерно в то же время (асинхронно).
  • B выполняется 0 или более раз при взаимодействии пользователя

У меня есть 3 различных сценариев, которые я хочу слушать с учетом этих 2 Наблюдаемые/API вызовов.

  1. Я хочу знать сразу, когда Наблюдаемые завершает
  2. Я хочу знать сразу, когда Наблюдаемые B завершает
  3. Я хочу знать, когда оба закончили

Во-первых, является ли это хороший вариант использования для RxJava?

Я знаю, как сделать каждый сценарий индивидуально (используя zip для последнего), хотя я не знаю, как делать все из них одновременно.

Если я подписываюсь на Наблюдаемый А, начинается А. Если я подписываюсь на B, начинается B. Если A & B полностью, прежде чем я подписаться на zip (a, b), я мог бы пропустить это событие и никогда не увидеть его полностью, не так ли?

Любое общее руководство будет оценено по достоинству. Мои знания RxJava довольно тонкие: P

ответ

5

Вы можете достичь этого, используя три разных наблюдаемых, по одному для каждого вашего случая.

Как вам нужно будет делиться состояниями между каждыми наблюдаемыми, вам придется преобразовать модифицированные холодные наблюдаемые в горячие наблюдаемые. (См here для получения дополнительной информации по этой теме)

ConnectableObservable a = service.callA().publish(); 
ConnectableObservable b = service.callB().publish(); 

a.subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */}, () -> {/* when A is completed */ }); 
b.subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */}, () -> {/* when B is completed */ }); 
a.mergeWith(b).subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */}, () -> {/* when A and B are completed */ }); 

a.connect(); // start subscription to a 
b.connect(); // start subscription to b 

Не делитесь объектом между OnCompleted методами или вы будете иметь дело с проблемами параллельно работающим.

+0

Удивительно, это было действительно полезно. Не возражаете ли вы развить бит на проблемах параллелизма, в которые я мог бы работать? Если я буду наблюдать их все в одной и той же теме, это все еще проблема? Я думаю, что сначала будет A или B, а затем A + B. – loeschg

+0

Наблюдаемый a, Наблюдаемый b и Наблюдаемый ab (объединенный наблюдаемый из a и b) могут быть выполнены в разных потоках. Таким образом, вызов onCompleted методов не может быть секвенциальным (вопреки rx-контракту). Вы можете прочитать общую переменную с именем «hello» в методе onCompleted. В следующей строке вы снова читаете ту же переменную. Значение может иметь изменение, поскольку другой метод onCompleded из другого наблюдаемого может изменить его. – dwursteisen

Смежные вопросы