BehaviorSubject vs PublishSubject - PullRequest
       1

BehaviorSubject vs PublishSubject

0 голосов
/ 25 апреля 2018

Я пытаюсь обдумать золотое правило (если есть) о:

Когда использовать BehaviorSubject?

и

Когда использовать PublishSubject?

Разница между ними очень ясна

Есть много видов предметов. Для этого конкретного требования PublishSubject работает хорошо, потому что мы хотим продолжить последовательность с того места, где он остановился. Таким образом, предполагая, что события 1,2,3 были отправлены в (B), после того, как (A) соединится обратно, мы хотим видеть только 4, 5, 6. Если бы мы использовали ReplaySubject, мы бы увидели [1, 2, 3], 4, 5, 6; или если бы мы использовали BehaviorSubject, мы бы увидели 3, 4, 5, 6 и т. д. (источник: Как думать о предметах в RxJava (часть 1) )

Я видел, что Subject используются в двух контекстах (как минимум), контексте пользовательского интерфейса и контексте слушателя.

  • Контекст интерфейса (например, MVVM)

Например, здесь a BehaviorSubject используется, и понятно, почему они используют Subject, а не Observable, но я изменил BehaviorSubject на PublishSubject, но поведение приложения по-прежнему то же самое.

  • Контекст слушателя

Почему они делают проект поле BehaviorSubject, а не PublishSubject?

Ответы [ 2 ]

0 голосов
/ 16 августа 2018

PublishSubject: запускается пустым и только излучает новые элементы подписчикам.Существует вероятность того, что один или несколько элементов могут быть потеряны между временем создания субъекта и подпиской на него наблюдателя, поскольку PublishSubject начинает испускать элементы сразу после создания.

BehaviorSubject: ему требуется начальное значение и он воспроизводится повторноили последний элемент для новых подписчиков.Поскольку BehaviorSubject всегда испускает последний элемент, вы не можете создать его, не задав начальное значение по умолчанию.BehaviorSubject полезен для отображения «значений во времени».Например, поток событий с днями рождения является субъектом, а поток возраста человека - объектом поведения.

0 голосов
/ 25 апреля 2018

Основное различие между PublishSubject и BehaviourSubject заключается в том, что последний запоминает последний испущенный элемент. Из-за этого BehaviourSubject действительно полезно, когда вы хотите испустить states.

Почему они делают поле проекта Поведенческим объектом, а не PublishSubject?

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

@Override public @NonNull Observable<Project> project() {
  return this.project;
}
...